zoukankan      html  css  js  c++  java
  • 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);
    	}
    }
    
  • 相关阅读:
    CR开发笔记-1工作前的准备
    CR开发笔记-2基础飞机的搭建以及测试代码
    c++还有一个小时考试
    c# winform 打印笔记
    aspcms部署
    c#复习笔记 继承
    [转]IoC框架
    Cinder-2 窗口的创建过程
    Cinder-1 TinderBox
    admin模板
  • 原文地址:https://www.cnblogs.com/xyqxyq/p/12328868.html
Copyright © 2011-2022 走看看