盒子

wangweikun 2023-11-23 20:46:33

#include<bits/stdc++.h> using namespace std; struct l{ int pre; int nxt; }node[100010]; bool de[100010]; void insert(int p,int x){ int q=node[p].nxt; node[p].nxt=x; node[x].pre=p; node[x].nxt=q; node[q].pre=x; de[x]=false; } void del(int key){ if(de[key])return; int q=node[key].pre; int p=node[key].nxt; node[q].nxt=p; node[p].pre=q; de[key]=true; } int main(){ int n,m,p,q,j,cnt=0; while(cin>>n>>m){ memset(node,0,sizeof(node)); cnt++; long long sum=0; for(int i=1;i<=n;i++){ insert(i-1,i); } for(int i=1;i<=m;i++){ cin>>j>>p>>q; if(j==2){ del(p); insert(q,p); } if(j==1){ del(p); insert(node[q].pre,p); } if(j==3){ int o=node[p].pre; del(p); insert(q,p); del(q); insert(o,q); } } for(int i=node[0].nxt,j=1;i!=0;i=node[i].nxt,j++){ if(j%2)sum+=i; } cout<<"Case "<<cnt<<": "<<sum<<endl; } }

共 2 条回复

wyrm

错误的测试数据: n = 3, m = 10。链表为 {1,2,3} 时,操作 3 2 1 有误。此时 j = 3, p = 2, q = 1, o = 1(node[p].pre)。 改法:特判 node[q].nxt == p 的情况,此时只需要 del(q); insert(p, q);

wyrm

3 10 3 2 1 3 3 1 2 3 2 2 2 1 1 1 2 3 3 2 3 2 1 3 1 2 3 1 2 3 2 1