1.
(1)链表,可以将一些元素有秩序地连接起来。
(这种顺序关系只有一条)。
(2)但在构建这种关系的过程中,可能需要了解链表中的元素“左右的元素是什么”,即:需要构建两个工具来记录各个元素的左右连接情况。
2.关于函数link:
void link (int l, int r) //连接l和r,l在左边
{
le[r] = l; ri[l] = r;
}
用于将两个元素左右连接起来。(不管他们二者相对于整个链表的位置)
代码:
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
int ll[100100];
int rr[100100],op,x,y;
void connect(int x,int y)
{
rr[x]=y;
ll[y]=x;
}
int main()
{
int n,nn,ca=0,t;
while(scanf("%d%d",&n,&nn)!=EOF)
{
for(int i=1;i<=n;i++)
{
ll[i]=i-1;
rr[i]=i+1;
}
ll[0]=n;rr[0]=1;rr[n]=0;
int shunxu=0;
while(nn--)
{
scanf("%d",&op);
if(op==4)shunxu=!shunxu;
else
{
scanf("%d%d",&x,&y);
if(op==3&&rr[y]==x) {t=x,x=y,y=t;}
if(op!=3&&shunxu) op=3-op;
if((op==1&&x==ll[y])||(op==2&&x==rr[y]))continue;
if (op == 1) //x移到y右边
connect(ll[x], rr[x]),connect(ll[y], x),connect(x, y);
else if (op == 2) //x移到y左边
connect(ll[x], rr[x]), connect(x, rr[y]), connect(y, x);
else if (y == rr[x]) //op==3&&x,y相邻
connect(ll[x], y), connect(x, rr[y]),connect(y, x);
else //不相邻
{
int ry = rr[y], ly = ll[y];
connect(ll[x], y),connect(y, rr[x]), connect(ly, x),connect(x, ry);
}
}
}int ii=0;
long long sum=0;
for(int i=1;i<=n;i++)
{
ii=rr[ii];
if(i%2==1)sum+=ii;
}
if(shunxu&&n%2==0)sum=(long long)n*(n+1)/2-sum;
printf("Case %d: %lld\n",++ca,sum);
}//注意导致超时的原因。。。可能是循环的结构搞错了
}