您的位置:首页 > 其它

例题6-5 移动盒子 UVa 12657 链表(模拟链表)

2015-09-16 16:28 344 查看
分析:看到这题,就想用list,自己写了好久,其中erase和insert需要注意好多东西,好不容易搞定了,提交总是超时。大概list的遍历会很慢吧。书上用的是数组形式双向链表,学习了一下,AC了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cstdlib>

using namespace std;
const int maxn=100005;
int Right[100005],Left[100005];

void link(int L, int R)
{
    Right[L]=R;
    Left[R]=L;
}

int main()
{
    int n,m;
    int op;
    int cas=0;
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1; i<=n; i++)
        {
            Left[i]=i-1;
            Right[i]=(i+1)%(n+1);
        }
        Right[0]=1;
        Left[0]=n;

        int inv=0;
        int X,Y;
        while(m--)
        {
            cin>>op;
            if(op==4)
                inv=!inv;
            else
            {
                cin>>X>>Y;
                if(op==3&&Right[Y]==X)  swap(X,Y);
                if(op!=3&&inv)  op=3-op;
                if(op==1&&Right[X]==Y)  continue;
                if(op==2&&Right[Y]==X)  continue;

                int LX=Left[X], RX=Right[X], LY=Left[Y], RY=Right[Y];
                if(op==1)
                {
                    link(LX,RX);
                    link(X,Y);
                    link(LY,X);
                }
                else if(op==2)
                {
                    link(LX,RX);
                    link(Y,X);
                    link(X,RY);
                }
                else if(op==3)
                {
                    if(RX==Y)
                    {
                        link(LX,Y);
                        link(Y,X);
                        link(X,RY);
                    }
                    else
                    {
                        link(LX,Y);
                        link(Y,RX);
                        link(LY,X);
                        link(X,RY);
                    }
                }
            }
        }
        int t=0;
        long long ans=0;
        for(int i=1; i<=n; i++)
        {
            t=Right[t];
            if(i%2)
                ans+=t;
        }
        if(inv&&n%2==0) ans=(long long)n*(n+1)/2-ans;
        cout<<"Case "<<++cas<<": "<<ans<<endl;
    }

    return 0;
}


TLE

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include<list>
#include<deque>
#define LL long long
using namespace std;

const int maxn=100005;
//typedef list<int>LIST;
int main()
{
    freopen("f.txt","r",stdin);
    list<int> lis;
    list<int>::iterator it,vx,vy,bed,ed,vvx,vvy;
    int n,m,x,y,kk;
    int cas=0;
    while(scanf("%d%d",&n,&m)!=EOF){
       if(!lis.empty())
        lis.clear();
        lis.push_back(0);
        for(int i=1;i<=n;i++){
            lis.push_back(i);
        }
        lis.push_back(0);
        bool flag=false;
        for(int i=0;i<m;i++){
            scanf("%d",&kk);
            if(kk==4){
                flag=!flag;
                continue;
            }
            scanf("%d%d",&x,&y);

           // if(kk==1){
           int posx=0,posy=0,p=0;
                for(it=lis.begin();it!=lis.end();it++){
                    p++;
                    if(*it==x){
                        vx=it;
                        posx=p;
                    }
                    else if(*it==y){
                        vy=it;
                        posy=p;
                    }
                 //   if(posx&&posy)break;
                }
                if(kk==3){
                   // if(vx++!=lis.end()--&&vy++!=lis.end()--){
                        vvx=vx;
                        vvy=vy;
                        lis.insert(vvx++,y);
                        lis.erase(vx);
                        lis.insert(vvy++,x);
                        lis.erase(vy);
                        continue;
                   // }

                }
                if(flag)kk=3-kk;
                if(kk==1){
//                    vvx=vx;
//                    vvy=vy;
                    if(posx==posy-1)continue;
                    if(posx<posy){
                         lis.insert(vy,x);
                         lis.erase(vx);
                    }
                    else{
                        lis.erase(vx);
                        lis.insert(vy,x);

                    }

                }
                else if(kk==2){
                    if(posx==posy+1)continue;
                    vy++;
                   if(posx<posy){
                         lis.insert(vy,x);
                         lis.erase(vx);
                    }
                    else{
                        lis.erase(vx);
                        lis.insert(vy,x);

                    }
                }

        }
        LL ans=0;
        int j=0;
        bed=lis.begin();
        bed++;
        ed=lis.end();
        ed--;
        for(it=bed;it!=ed;it++){

            if((++j)%2==1)ans+=*it;

        }
        if(flag&&j%2==0)ans=(LL)n*(n+1)/2-ans;
        printf("Case %d: %lld\n",++cas,ans);

    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: