UVA 12657 Boxes in a Line【双向链表】

来源:互联网 发布:淘宝用什么软件做图片 编辑:程序博客网 时间:2024/05/22 04:50

https://vjudge.net/problem/UVA-12657


#include<cstdio>#include<math.h>#include<cstring>#include<climits>#include<string>#include<queue>#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<climits>#include<string>#include<queue>#include<stack>#include<set>#include<map>#include<list>#include<algorithm>using namespace std;#define rep(i,j,k)for(i=j;i<k;i++)#define per(i,j,k)for(i=j;i>k;i--)#define MS(x,y)memset(x,y,sizeof(x))#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define ll long long#define abs(x) (x>0?x:-x)const int INF=0x7ffffff;const ll MAX=1e18;const int M=1e5+10;int l[M],r[M];int i,j,k,n,m;void link(int a,int b){    r[a]=b,l[b]=a;}int main(){    int T=0;    while(~scanf("%d%d",&n,&m)){        int flag=0;        int x,y,op;        for(i=1;i<=n;i++)            r[i]=i+1,l[i]=i-1;        r[0]=1,l[0]=-1,r[n+1]=-1,l[n+1]=n;        for(i=1;i<=m;i++){            scanf("%d",&op);            if(op==4){                flag^=1; continue;            }            if(flag&&op<=2)op=3-op;            scanf("%d%d",&x,&y);            if(op==1&&l[y]==x)continue;            if(op==2&&r[y]==x)continue;            int lx=l[x],ly=l[y],rx=r[x],ry=r[y];            if(op==1) link(lx,rx),link(ly,x),link(x,y);            else if(op==2)link(lx,rx),link(y,x),link(x,ry);            else {                 if(rx==y)link(lx,rx),link(y,x),link(x,ry);                 else if(lx==y)link(lx,rx),link(ly,x),link(x,y);                 else  link(lx,y),link(y,rx),link(ly,x),link(x,ry);            }        }        int k=0;        ll ans=0;        for(i=1;i<=n;i++){            k=r[k];            if(i&1)ans+=k;        }        if(flag)ans=(ll)n*(n+1)/2-ans;        printf("Case %d: %lld\n",++T,ans);    }    return 0;}


0 0
原创粉丝点击