关闭

UVA 12657(双向链表模拟)

116人阅读 评论(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
查看评论

uva12657 双向链表的实现与痛苦的调试

题目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 t...
  • liuzheng_yong
  • liuzheng_yong
  • 2017-03-25 19:44
  • 217

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

题意: 给定N个盒子,分别标号为1~N;有下面4种操作: “1 X Y” 表示将X移到Y的左边; “2 X Y” 表示将Y移到Y的右边; “3 X Y” 表示交换X与Y的位置; “4” 表示将1~N所有的盒子反序。 要你求经过M次操作之后,所有奇数位置的盒子标号之和。
  • ACMore_Xiong
  • ACMore_Xiong
  • 2015-08-18 16:41
  • 1871

UVa 12657 双向链表

UVa 12657 双向链表
  • DaI253
  • DaI253
  • 2015-12-08 14:57
  • 146

uva12657 boxes in a line

#include #include using namespace std; const int N = 100005; int le[N], ri[N], n, m; typedef long long ll; void link(int l, int r)//链接l和r,l在左边 { l...
  • a197p
  • a197p
  • 2015-01-31 22:30
  • 508

UVA 12657 Boxes in a Line 模拟 双向链表

想都不用想,用list直接模拟肯定超时,只能自己手写         用两个数组le和ri,写一个双向链表,le[x]表示盒子x左边的盒子编号,ri[x]表示盒子x右边的盒子编号,实际上就是一个双向链表 。只不过我们通过两个数组模拟之后可以O(1)的拿到某一...
  • Good_night_Sion_
  • Good_night_Sion_
  • 2017-03-02 19:46
  • 237

UVA 12657

双向链表 ///双向链表---节点 ///如果数据结构上的某一个操作很耗时,有时可以用加标记的方式处理,而不需要真的去执行那个操作, ///但同时,该数据结构的所有其他操作都要考虑这个操作 #include #include #include #include #include ...
  • DoJintian
  • DoJintian
  • 2014-12-19 17:03
  • 1565

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,然...
  • zhang_xueping
  • zhang_xueping
  • 2015-08-17 21:50
  • 576

UVA 12657 链表模拟

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 ...
  • Bcwan_
  • Bcwan_
  • 2016-05-30 18:07
  • 228

UVA - 12657 Boxes in a Line(双向链表)

#include #include #include #include using namespace std; const int maxn = 100000+5; int n,m; int Left[maxn],Right[maxn]; void link(int L ,int R)...
  • u013300509
  • u013300509
  • 2015-03-05 13:46
  • 233

UVA-133 双向链表模拟题

The Dole Queue  In a serious attempt to downsize (reduce) the dole queue, The New National Green Labour Rhinoceros Party has decided o...
  • u013480370
  • u013480370
  • 2014-07-10 20:31
  • 278
    个人资料
    • 访问:3312次
    • 积分:182
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:6篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论