zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    leetcode 390. 消除游戏
    C12Test5 record
    IELTS Writing Task 1: two-chart answer
    rails work
    java 依赖注入
    Java1.7已经舍弃substr了
    在存储过程创建临时表,插入字段,更新字段
    在存储过程里创建临时表,往表中直接插入数据
    存储过程里分页的例子
    验证方法、自己写一个日期控件、
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6930102.html
Copyright © 2011-2022 走看看