National Contest for Private Universities (NCPU), 2019 C Boxes(双向链表)

题目中的要求如果x在y的左边,不需要移动,x在y的右边,2操作不需要移动。
有一个问题是,如果x与y相邻,这时的swap操作变成了三个而不是四个,这点尤其需要注意,不然就会死循环。注意x是和y相邻,这时应该考虑x在y的左边还是在y的右边,因为修改指针的操作是有方向性的。

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;

struct Node {
	int left,right,val;
}node[maxn];

void Link(int x,int y)
{
	node[x].right=y;
	node[y].left=x;
}

int main()
{
	int n,m,comm,x,y,rev_cnt;
	while (scanf("%d%d",&n,&m)!=EOF) {
		rev_cnt=0; 
		for (int i=1;i<=n+1;i++) {
			node[i].val=i;
			node[i].left=i-1;
			node[i].right=i+1;
		}
		node[0].right=1;
		node[n+1].val=0;
		node[n+1].right=-1;
		while (m--) {
			scanf("%d",&comm);
			if (comm!=4) {
				scanf("%d%d",&x,&y);
			}
			
			if (rev_cnt%2==1) {
				if (comm==1) {
					comm=2;
				}
				else if (comm==2) {
					comm=1;
				}
			}
			
			if (comm==1) {
				if (node[x].right==y) {
					continue;
				}
				int lx=node[x].left,rx=node[x].right,ly=node[y].left,ry=node[y].right;
				Link(lx,rx);
				Link(ly,x);
				Link(x,y);
			}
			else if (comm==2) {
				if (node[y].right==x) {
					continue;
				}
				int lx=node[x].left,rx=node[x].right,ly=node[y].left,ry=node[y].right;
				Link(lx,rx);
				Link(y,x);
				Link(x,ry);
			}
			else if (comm==3) {
				if (node[x].right==y) {
					int lx=node[x].left,rx=node[x].right,ly=node[y].left,ry=node[y].right;
					Link(lx,y);
					Link(y,x);
					Link(x,ry);
				}
				else if (node[y].right==x) {
					int tmp=x;
					x=y;
					y=tmp;
					int lx=node[x].left,rx=node[x].right,ly=node[y].left,ry=node[y].right;
					Link(lx,y);
					Link(y,x);
					Link(x,ry);
				}
				else {
					int lx=node[x].left,rx=node[x].right,ly=node[y].left,ry=node[y].right;
					Link(lx,y);
					Link(y,rx);
					Link(ly,x);
					Link(x,ry);
				}
			}
			else {
				rev_cnt++;
			}

//			for (int i=node[0].right;i>0;i=node[i].right) {
//				printf("%d
",node[i].val);
//			}

		}
		int k;
		if (rev_cnt%2==1&&n%2==0) {
			k=0;
		}
		else {
			k=1;
		}
		long long ans=0,cnt=1;
		for (int i=node[0].right;i>0;i=node[i].right) {
			if (cnt%2==k) {
				ans+=node[i].val;
			}
			//printf("%d
",node[i].val);
			cnt++;
		}
		printf("%lld
",ans);
	}
}
原文地址:https://www.cnblogs.com/xyqxyq/p/12328868.html