记录编号 |
245266 |
评测结果 |
MMMMMMMMMM |
题目名称 |
Travel |
最终得分 |
0 |
用户昵称 |
神利·代目 |
是否通过 |
未通过 |
代码语言 |
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);
}