关闭

UVA 12657(双向链表模拟)

67人阅读 评论(0) 收藏 举报
分类:

模拟双向链表,自己的方法太繁琐了╥﹏╥...

这是我的代码(好渣)

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <ctime>
#include <iomanip>
using namespace std;
int l[100005],r[100005];
int main()
{
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
    int www=1;
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
    int i;
    for(i=0;i<=n+2;i++)
    {
        l[i]=i-1;
        r[i]=i+1;
    }
    int fanzhuan=0;
    for(i=1;i<=m;i++)
    {
        int flag;
        scanf("%d",&flag);
        if(flag==4){
                fanzhuan+=1;
                continue;
        }
        else
        {
            if(flag==1&&fanzhuan%2==0||flag==2&&fanzhuan%2==1)
             {
                 int a,b;
                 scanf("%d%d",&a,&b);
				 int la=l[a];
                 int lb=l[b];
                 int ra=r[a];
                 int rb=r[b];
                 if(a==b)continue;
                 if(l[b]==a)continue;
                 if(r[b]==a)
                 {
                 	r[lb]=a;
                 	l[a]=lb;
                 	r[a]=b;
                 	l[b]=a;
                 	r[b]=ra;
                 	l[ra]=b;
                 	continue;
                 }
                 r[lb]=a;
                 l[b]=a;
                 r[la]=ra;
                 l[ra]=la;
                 l[a]=lb;
                 r[a]=b;
             }
             else if(flag==2&&fanzhuan%2==0||flag==1&&fanzhuan%2==1)
             {
                int a,b;
                 scanf("%d%d",&a,&b);
                 int la=l[a];
                 int lb=l[b];
                 int ra=r[a];
                 int rb=r[b];
                 if(a==b)continue;
                 if(r[b]==a)continue;
                 if(l[a]==b)
                 {
                 	r[la]=b;
                 	l[rb]=a;
                 	r[a]=rb;
                 	l[a]=b;
                 	l[b]=la;
                 	r[b]=a;
                 	continue;
                 }

                 r[b]=a;
                 l[rb]=a;
                 l[a]=b;
                 r[a]=rb;
                 r[la]=ra;
                 l[ra]=la;
             }
             else if(flag==3)
             {
                 int a,b;
                 scanf("%d%d",&a,&b);
                 int la=l[a];
                 int lb=l[b];
                 int ra=r[a];
                 int rb=r[b];
                 if(r[a]!=b&&l[a]!=b&&a!=b)
                 {
                 l[r[a]]=b;
                 r[l[b]]=a;
                 l[r[b]]=a;
                 r[l[a]]=b;
                 l[a]=lb;
                 r[a]=rb;
                 l[b]=la;
                 r[b]=ra;
                 }
                 else if(r[a]==b)
                 {
                     l[a]=b;
                     r[a]=rb;
                     r[b]=a;
                     l[b]=la;
                     r[la]=b;
                     l[rb]=a;
                 }
                 else if(r[b]==a)
                 {
                     l[b]=a;
                     r[b]=ra;
                     r[a]=b;
                     l[a]=lb;
                     r[lb]=a;
                     l[ra]=b;
                 }
             }
        }
//        if(fanzhuan%2==0)
//       {
//        long long  shu=1;
//        for(long long i=0;;)
//        {
//            i=r[i];
//            if(i==n+1||shu==n+1)break;
//            printf("%d ",i);
//            shu+=1;
//        }
//       }
//    else {
//        long long  shu=1;
//        for(long long i=n+1;;)
//        {
//            i=l[i];
//            if(i==0||shu==n+1)break;
//            printf("%d ",i);
//            shu+=1;
//        }
//        }
//        printf("\n");
    }
    long long sum=0;
    if(fanzhuan%2==0)
    {
        long long  shu=1;
        for(long long i=0;;)
        {
            i=r[i];
            if(i==n+1||shu==n+1)break;
//            printf("%d ",i);
            if(shu%2==1)sum+=i;
            shu+=1;
        }
    }
    else {
        long long  shu=1;
        for(long long i=n+1;;)
        {
            i=l[i];
            if(i==0||shu==n+1)break;
//            printf("%d ",i);
            if(shu%2==1)sum+=i;
            shu+=1;
        }
    }
    printf("Case %d: %lld\n",www,sum);
    www+=1;
    }
}
/*
21 6
3 19 19
2 2 4
2 20 14
1 8 9
3 20 16
3 16 2
*/
下面是网上的大神代码(摘自:http://www.bubuko.com/infodetail-1128030.html)
# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;

int l[100005],r[100005];

void link(int a,int b)
{
    r[a]=b,l[b]=a;
}

int main()
{
    int n,m,op,x,y,flag,cas=0;
    while(scanf("%d%d",&n,&m)==2)
    {
        for(int i=1;i<=n;++i)
            r[i]=(i+1)%(n+1),l[i]=i-1;
        r[0]=1,l[0]=n;

        flag=0;
        while(m--)
        {
            scanf("%d",&op);
            if(op==4)
                flag=!flag;
            else{
                scanf("%d%d",&x,&y);
                if(op==3&&r[y]==x)///方便下面的操作;
                    swap(x,y);
                if(op!=3&&flag)
                    op=3-op;
                if(op==1&&l[y]==x)
                    continue;
                if(op==2&&r[y]==x)
                    continue;

                int lx=l[x],rx=r[x],ly=l[y],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(r[x]==y)
                        link(lx,y),link(y,x),link(x,ry);
                    else
                        link(lx,y),link(y,rx),link(ly,x),link(x,ry);
                }
            }
        }
        int k=0;
        long long ans=0;
        for(int i=1;i<=n;++i){
            k=r[k];
            if(i&1)
                ans+=k;
        }
        if(flag&&n%2==0)
            ans=(long long)n/2*(n+1)-ans;
        printf("Case %d: %lld\n",++cas,ans);
    }
    return 0;
}


1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2207次
    • 积分:166
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:6篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论