• 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);
    	}
    }
    
  • 相关阅读:
    ReSharper Tips—GotoImplementation
    Possible multiple enumeration of IEnumerable
    Hello, Razor!
    自话自说——POI使用需要注意一个地方
    css中怎么设置透明度的问题
    记录排查国标直播流播放卡顿的问题
    互联网上做广告的优点
    C#、.Net经典面试题集锦(一)
    什么是MFC
    C/S与B/S 的区别
  • 原文地址:https://www.cnblogs.com/xyqxyq/p/12328868.html
Copyright © 2020-2023  润新知