记录编号 245266 评测结果 MMMMMMMMMM
题目名称 Travel 最终得分 0
用户昵称 Gravatar神利·代目 是否通过 未通过
代码语言 C++ 运行时间 0.000 s
提交时间 2016-04-02 18:55:26 内存使用 2.00 MiB
显示代码纯文本
#include<stdio.h>
#include<math.h>
int n,m,t,p[100001],q[100001],A,B,C;
struct cards{int n,l[2000],r[2000];}x,a,b,c;
inline int ABS(int X){return X<0?-X:X;}
inline void work(cards &a,int A){
	int i,j;a.n=0;
	for(i=1,j=0;j<A;++i)
	    if(j+ABS(x.l[i]-x.r[i])+1<=A){
			j+=ABS(x.l[i]-x.r[i])+1;
			++a.n;
			a.l[a.n]=x.l[i];
			a.r[a.n]=x.r[i];
	    }else{
			++a.n,a.l[a.n]=x.l[i];
			if(x.r[i]>x.l[i]){
				a.r[a.n]=x.l[i]+(A-j-1);
				x.l[i]+=A-j;
			}else{
				a.r[a.n]=x.l[i]-(A-j-1);
				x.l[i]-=A-j;
			}
			break;
		}
	for(j=i;j<=x.n;++j)
		x.l[j-i+1]=x.l[j],x.r[j-i+1]=x.r[j];
	x.n-=i-1;
}
inline void put(cards &a,int p){
	for(int i=x.n;i;--i)
		x.l[i+a.n]=x.l[i],x.r[i+a.n]=x.r[i];
	x.n+=a.n;
	if(p==1)
	    for(int i=1;i<=a.n;++i)
			x.l[i]=a.l[i],x.r[i]=a.r[i];
	else for(int i=1;i<=a.n;++i)
	    x.l[i]=a.r[a.n-i+1],x.r[i]=a.l[a.n-i+1];
}
inline void update(){
	for(int i=1,j=0;i<=x.n;++i)
	    if(x.r[i]>x.l[i])
	        for(int k=x.l[i];k<=x.r[i];++k)
	            q[++j]=p[k];
		 else for(int k=x.l[i];k>=x.r[i];--k)
		    q[++j]=p[k];
	for(int i=1;i<=n;++i)p[i]=q[i];
	x.n=1,x.l[1]=1,x.r[1]=n;
}
int main(){
	freopen("travel_travel.in","r",stdin);
	freopen("travel_travel.out","w",stdout);
	scanf("%d%d",&n,&m),t=sqrt(m);
	for(int i=1;i<=n;++i)p[i]=i;
	x.n=1,x.l[1]=1,x.r[1]=n;
	while(m--){
		scanf("%d%d%d",&A,&B,&C);
		work(a,A),work(b,B),put(a,1);
		work(c,C),put(b,-1),put(c,1);
		if(m%t==0)update();
	}
	for(int i=1;i<=n;++i)printf("%d ",p[i]);
	//while(1);
}