Uva 12657 Boxes in a Line 双向链表

  • 操作4比较特殊,为了避免一次性修改所有元素的指针,由于题目只要求输出奇数盒子的编号,所以我们可以灵活的根据是否进行过操作4对操作1 操作2 进行改动
  • 操作3不受操作4影响

上代码。。。。

#include<cstdio>
#include<algorithm>
const int maxn=100000+5;
int right[maxn],left[maxn];
void link (int L,int R){
	right[L]=R;left[R]=L;
}
//在双向链表这样复杂的数据结构中,往往会编写一些辅助函数来设置链接关系
int main(){
	int m,n,kase=0;
	while(scanf("%d%d",&n,&m)==2){
      for(int i=1;i<=n;i++){
        right[i]=(i+1)%(n+1);
	    left[i]=i-1;
      }
	  right[0]=1;left[0]=n;
	  int op,x,y,flag=0;
	  while(m--){
		scanf("%d",&op);
		if (op==4) flag=!flag;//操作4是否执行奇数次
		else{
            scanf("%d%d",&x,&y);
		    if(op==3&&right[y]==x) std::swap(x,y);//为了方便操作,避免重写第37行代码,当然你重写也可以
		    if(op!=3&&flag) op=3-op;
		    if(op==1&&x==left[y]) continue;//如果x已经在y的左边则忽略此指令
		    if(op==2&&x==right[y]) continue;//如果x已经在y的右边则忽略此指令
		    int lx=left[x],rx=right[x],ly=left[y],ry=right[y];
		    if(op==1){
			  //插入到x的左边并删除原来x结点的位置
			  link(lx,rx);link(ly,x);link(x,y);
		    }
		    else if (op==2){
			  //插入到y的右边并删除原来x结点的位置
			  link(lx,rx);link(y,x);link(x,ry);
		    }
		    else if(op==3){
			 if(right[x]==y){link(lx,y);link(y,x);link(x,ry);
			 }
			 else {
              link(lx,y);link(y,rx);//y插入到x的位置
              link(ly,x);link(x,ry);//x插入到y的位置
			 }
		     }
	    }
	  }
	    int b=0;
	    long long ans=0;
	    for (int i=1;i<=n;i++){
		    b=right[b];
		    if(i&1) ans+=b;
	    }
	    if(flag&&n%2==0) ans=(long long)n*(n+1)/2-ans;
	    printf("Case %d: %lld\n",++kase,ans);
    }
	return 0;
}

/*
样例输入:
6 4
1 1 4
2 3 5
3 1 6
4
6 3
1 1 4
2 3 5
3 1 6
100000 1
4
样例输出:
case 1: 12
case 2: 9
case 3: 2500050000
*/

  

时间: 2024-10-12 19:05:49

Uva 12657 Boxes in a Line 双向链表的相关文章

UVa 12657 Boxes in a Line(双向链表的应用)

Boxes in a Line You have n boxes in a line on the table numbered 1 . . . n from left to right. Your task is to simulate 4 kinds of commands: ? 1 X Y : move box X to the left to Y (ignore this if X is already the left of Y ) ? 2 X Y : move box X to th

uva 12657 - Boxes in a Line(AC和TLE的区别,为什么说STL慢..)

用STL中的list写的,TLE #include<cstdio> #include<iostream> #include<cstring> #include<list> #include<algorithm> using namespace std; list<int> l; list<int>::iterator it1,it2,it3,it4,it5,it; void work(int a,int a1=1,int

UVa 12657 Boxes in a Line(应用双链表)

Boxes in a Line You have n boxes in a line on the table numbered 1 . . . n from left to right. Your task is to simulate 4 kinds of commands: ? 1 X Y : move box X to the left to Y (ignore this if X is already the left of Y ) ? 2 X Y : move box X to th

UVA 12657 Boxes in a Line(双向链表+小技巧)

题意:对于一行按照顺序排列盒子数字与位置都为 1,2,3,4....n 执行四种操作 c = 1    x 放到 y 的左边 c =2     x 放到 y 的右边 c =3 交换 x, y c =4 颠倒链 最后求出奇数位置的数的总和 题解:直接维护无论如何每次每次都需要维护一段区间的位置,因此不去看位置.只需要知道每个盒子左边是哪个盒子右边是哪个盒子 这样就直接使用双向链表维护,接着颠倒时注意只是标记就好 最后注意几个细节: 首先颠倒后1与2的交换需要互换: 维护链表时可以提取出一个函数,每

UVA 12657 Boxes in a Line

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4395 题目意思是说,给出一个数n,表示存在一个整数序列1--n,然后进行四种操作: 操作一:输入x,y,表示将x移到y的左边(若x本来就在y的左边则忽略): 操作二:输入x,y,表示将x移到y的右边(若x本来就在y的右边则忽略): 操作三:输入x,y,表示交换x和y. 操作四:将

UVa 12657 Boxes in a Line(数组模拟双链表)

题目链接 1 /* 2 问题 3 将一排盒子经过一系列的操作后,计算并输出奇数位置上的盒子标号之和 4 5 解题思路 6 由于数据范围很大,直接数组模拟会超时,所以采用数组模拟的链表,left[i]和right[i]分别表示i号盒子的左边是谁和右边 7 是谁.特别提醒,4这个操作可以采用其他的办法去标记,而不必真的去模拟交换,否则会超时. 8 */ 9 10 #include<cstdio> 11 #include<algorithm> 12 13 using namespace

12657 - Boxes in a Line

Boxes in a Line You have n boxes in a line on the table numbered 1-n from left to right. Your task is to simulate 4 kinds of commands: 1 X Y : move box X to the left to Y (ignore this if X is already the left of Y) 2 X Y : move box X to the right to

Uva12657 (Boxes in a Line)移动盒子

UVA 12657 Boxes in a Line You have n boxes in a line on the table numbered 1 . . . n from left to right. Your task is to simulate 4kinds of commands:• 1 X Y : move box X to the left to Y (ignore this if X is already the left of Y )• 2 X Y : move box

UVA12657 Boxes in a Line【双向链表】【数组模拟】

You have n boxes in a line on the table numbered 1 . . . n from left to right. Your task is to simulate 4 kinds of commands: ? 1 X Y : move box X to the left to Y (ignore this if X is already the left of Y ) ? 2 X Y : move box X to the right to Y (ig