紫薯。。不知道该投什么栏。侵删
移动盒子
题目
先设立一个a[]用于储存数字,然后声明一个next[]用于调换顺序。
或者使用left[] right[]来控制顺序。
具体的代码是
for(int i=1;i<=n;++i){
a[i]=i;
left[i]=i-1;
right[i]=i+1;
}
//left[n+1]=n;
right[0]=1;
right[n]=0;
left[0]=n;//为什么要设置0呢?
在后续的操作中(如op1)可能会使用到0,(若0=ly),此时第一位变为x
left[0]=n,是因为right[n]=0,这样形成一个闭环,才能够排序(起始点已知)。(op2,,ry=0,)
可以设置一个便于关联节点的函数
void link(int l,int r){
right[l]=r;
left[r]=l;
}
核心代码是3个函数,这里以op1为例。
void op1(int x,int y){//x,y本身就代表盒子x,y
int lx=left[x];
int rx=right[x];
int ly=left[y];
link(lx,rx);
link(ly,x);
link(x,y);
}
接下来是题意的简化,op4是一个很耗时的过程,所以可以用inv记录反转的次数,但同时要考虑反转时op1和op2是对调的,所以在调用函数时可以3-op。
附带一题,单向链表
题目