• CSUOJ 1329 一行盒子(数组模拟链表)


    题目:http://acm.csu.edu.cn/OnlineJudge/problem.php?

    id=1329

    题意:

    分析:数组模拟指针,每一个节点有两个指针(前驱和后继),每一个操作仅仅需改变相关前驱指针和后继指针的值。

    代码:

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <time.h> 
    using namespace std;
    const int maxn = 1e5+6;
    int *Next,*Per,N,M;
    
    void Init()
    {
    	for(int i=0;i<=N+1;i++)
    	{
    		Next[i]=i+1;
    		Per[i]=i-1;
    	}
    }
    inline void Link1(int x,int y) //put x on the left of y
    {
    	Next[Per[x]]=Next[x];
    	Per[Next[x]]=Per[x];
    	Next[x]=y;
    	Per[x]=Per[y];
    	Next[Per[y]]=x;
    	Per[y]=x;
    }
    inline void Link2(int x,int y) //put x on the right of y
    {
    	Next[Per[x]]=Next[x];
    	Per[Next[x]]=Per[x];
    	Next[x]=Next[y];
    	Per[x]=y;
    	Per[Next[y]]=x;
    	Next[y]=x;
    }
    inline void Link3(int x,int y) //swap a and b 
    {
    	if(x==Per[y])
    	{
    		Next[Per[x]]=y;
    		Per[Next[y]]=x;
    		Per[y]=Per[x];
    		Next[x]=Next[y];
    		Next[y]=x;
    		Per[x]=y;
    	}
    	else if(x==Next[y])
    	{
    		Next[Per[y]]=x;
    		Per[Next[x]]=y;
    		Next[y]=Next[x];
    		Per[x]=Per[y];
    		Next[x]=y;
    		Per[y]=x;
    	}
    	else
    	{
    		Next[Per[x]]=y;
    		Next[Per[y]]=x;
    		int XPE=Per[x],XNE=Next[x],YPE=Per[y],YNE=Next[y];
    		Per[y]=XPE;
    		Per[x]=YPE;
    		Next[x]=YNE;
    		Next[y]=XNE;
    		Per[XNE]=y;
    		Per[YNE]=x;
    	}
    }
    
    int main()
    {
    	Next=(int *)malloc(sizeof(int)*maxn);
    	Per=(int *)malloc(sizeof(int)*maxn);
    	int i,j,ty,x,y,cnt,tp,ncase=1;
    	while(scanf("%d%d",&N,&M)!=EOF)
    	{
    		Init();
    		cnt=0;
    		for(i=1;i<=M;i++)
    		{
    			scanf("%d",&tp);
    			if(tp==1)
    			{
    				scanf("%d%d",&x,&y);
    				if(x==Per[y])
    					continue ;
    				Link1(x,y);
    			}
    			else if(tp==2)
    			{
    				scanf("%d%d",&x,&y);
    				if(x==Next[y])
    					continue ;
    				Link2(x,y);
    			}
    			else if(tp==3)
    			{
    				scanf("%d%d",&x,&y);
    				Link3(x,y);
    			}
    			else
    			{
    				cnt++;
    				swap(Next,Per);
    			}
    		}
    		long long ans=0;
    		if(cnt&1)
    			for(i=Next[N+1];i<=N && i>=1;i=Next[Next[i]])
    				ans+=i;
    		else
    			for(i=Next[0];i<=N && i>=1;i=Next[Next[i]])
    				ans+=i;
    		printf("Case %d: %lld
    ",ncase++,ans);
    	}
    	return 0;
    }

  • 相关阅读:
    git上传
    #if debug 模式
    .net core 获取appsetting配置信息
    映射的问题
    net core 支付宝回调参考
    .net core 3.1开发遇到的问题
    .net core 中对象转json以及反序列化
    auotmapper在net core 3.1的使用
    net core 3.1 webapi的开发遇到的问题
    OCP prepare 20140703
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6930102.html
Copyright © 2020-2023  润新知