P1188 PASTE
  • 板块题目总版
  • 楼主New_hope
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/10/8 14:45
  • 上次更新2023/10/27 08:12:03
查看原帖
P1188 PASTE
416242
New_hope楼主2022/10/8 14:45

样例对,爆零了

本程序

#include<bits/stdc++.h>
#define Maxn 100005
using namespace std;

int num[Maxn],t1[Maxn],t2[Maxn];

void copy1(int x,int y)
{
	int j = x;
	for(int i = 1; i <= y-x+1; i ++, j ++){
		t1[i] = num[j];
	}
}
void copy2(int x,int y){
	int j = x;
	for(int i = 1; i <= y-x+1; i ++, j ++){
		t2[i] = num[j];
	}
} 

void paste2(int s,int len1,int e,int len2){
	
	int i;
	i = len1;
	while(i){
		num[s] = t1[i];
		i --,s --;
	}
	i = len2;
	while(s >= e){
		num[s] = t2[i];
		i --,s --;
	}
}
void paste1(int s){
	int i;
	i = 1;
	while(t1[i] != 0){
		num[s] = t1[i];
		i ++,s ++;
	}
	i = 1;
	while(t2[i] != 0){
		num[s] = t2[i];
		i ++,s ++;
	}
}

int main(){
	
	int n,k;
	cin >> n >> k;
	for(int i = 1; i <= n; i ++){
		num[i] = i;
	}
	for(int i = 1; i <= k; i ++){
		int l,r,f;
		cin >> l >> r >> f;
		copy1(l,r);
		
		// printf("t1={%d",t1[1]);
		// for(int j = 2; j <= r-l+1; j ++){
			// printf(",%d",t1[j]);
		// }
		// printf("};\n");
		
		if(f < l){
			copy2(f+1,l-1);
			
			// printf("t2={%d",t2[1]);
			// for(int j = 2; j <= l-f-1; j ++){
				// printf(",%d",t2[j]);
			// }
			// printf("};\n");
			
			paste1(f+1);
		}
		else if(f > r){
			copy2(r+1,f);
			
			// printf("t2={%d",t2[1]);
			// for(int j = 2; j <= f-r; j ++){
				// printf(",%d",t2[j]);
			// }
			// printf("};\n");
			
			paste2(f,r-l+1,l,f-r);
		}		
		
		memset(t1,0,sizeof(t1));
		memset(t2,0,sizeof(t2));
		// for(int j = 1; j <= n; j ++){
			// cout << num[j] << " ";
		// }	
		// cout << endl;
	}
	for(int i = 1; i <= 10; i ++){
		cout << num[i] << endl;
	}
	return 0;
}

题解标程

#include<bits/stdc++.h>
#define up(l,r,i) for(int i=l;i<=r;i++)
#define dn(l,r,i) for(int i=l;i>=r;i--)
using namespace std;

typedef long long LL;
const int INF =2147483647;
int qread(){
    int w=1,c,ret;
    while((c=getchar())> '9'||c< '0') w=(c=='-'?-1:1); ret=c-'0';
    while((c=getchar())>='0'&&c<='9') ret=ret*10+c-'0';
    return ret*w;
}
const int MAXN =1e3+3;
int n,m,S[MAXN],T[MAXN],L[MAXN];
int main(){
    n=qread(),m=qread(); up(1,m,i){
        int a=qread(),b=qread(),c=qread();
        L[i]=b-a+1,S[i]=c+1,T[i]=a;
    }
    up(1,10,i){
        int t=i; dn(m,1,j){
            if(S[j]<=t&&t<=S[j]+L[j]-1) t+=T[j]-S[j]; else
            if(S[j]> t&&T[j]<=t) t+=L[j]; else
            if(S[j]< t&&t-L[j]<T[j]) t-=L[j];
        }
        printf("%d\n",t);
    }
    return 0;
}
                                

但是以下数据

输入:
12 2
3 9 0
1 3 7
本程序输出:
6
7
8
9
3
4
5
1
2
10
标程输出:
6
7
8
9
1
2
10
3
4
5

亲测(纸上验算)是:
6
7
8
9
3
4
5
1
2
10

是出现了什么读题错误吗

2022/10/8 14:45
加载中...