一行盒子 (模拟) 13年湖南省赛题

好伤心啊 wocao 这道题模拟了两个半小时 最后全错 因为不知道数组模拟链表的时候 自交了!!
哇 好伤心 好挫败 写个数组模拟链表写不出来 磨磨蹭蹭 最后还是错的 还是”参考”了刘汝佳神犇的代码
……..
前面的都是废话
一开始 哇 我写的一塌糊涂
a[p1r].l=p1l; 比如这一句,意思是把p1左边的左边和p1右边相连

p1l—-p1——p1r

意思就是把图中的p1去了 把旁边两个相连
哇 之前的代码就是
int temp=p1-1;
a[p1-1].l=temp;

我真的佩服我自己 9999(6翻了)

#include<cstdio>
#include<cstring>
const int maxn=100005;
struct note
{
    int l,r;
} a[maxn];
int p1,p2,p;
typedef long long ll;
ll n,m;
void solve_l()//交换到y左边
{
    int p1l=a[p1].l;
    int p1r=a[p1].r;
    int p2l=a[p2].l;
    int p2r=a[p2].r;
    if(p2l==p1)return;
    a[p1l].r=p1r;
    a[p1r].l=p1l;
    a[p1].l=p2l;
    a[p2l].r=p1;
    a[p1].r=p2;
    a[p2].l=p1;
}
void solve_r()//交换到y右边
{
    int p1l=a[p1].l;
    int p1r=a[p1].r;
    int p2l=a[p2].l;
    int p2r=a[p2].r;
    if(p2r==p1)return;
    a[p1l].r=p1r;
    a[p1r].l=p1l;
    a[p1].l=p2;
    a[p2].r=p1;
    a[p1].r=p2r;
    a[p2r].l=p1;
}

void solve_c()//两个相互交换
{
    int p1l=a[p1].l;
    int p1r=a[p1].r;
    int p2l=a[p2].l;
    int p2r=a[p2].r;
    if(a[p1].r==p2)///避免自环
    {
        a[p2].l=p1l;
        a[p1l].r=p2;
        a[p1].r=p2r;
        a[p2r].l=p1;
        a[p2].r=p1;
        a[p1].l=p2;
        return ;
    }
    a[p1l].r=p2;
    a[p2].l=p1l;
    a[p2].r=p1r;
    a[p1r].l=p2;
    a[p2l].r=p1;
    a[p1].l=p2l;
    a[p2r].l=p1;
    a[p1].r=p2r;
}

int main()
{
    int coun=1;
    freopen("in1.txt","r",stdin);
    while(scanf("%lld%lld",&n,&m)!=-1)
    {
        for(int i=1; i<=n; i++)
        {
            a[i].l=i-1;
            a[i].r=i+1;
        }
        a[0].l=n;
        a[0].r=1;
        a[n].r=0;
        bool der=false;
        while(m--)
        {
            scanf("%d",&p);
            if(p==4)der=!der;
            else
            {
                scanf("%d%d",&p1,&p2);
                if(p == 3 && a[p2].r==p1) p1^=p2^=p1^=p2;///避免自环
                if(p != 3 && der) p = 3 - p;
                if(p == 1 && p1==a[p2].l) continue;
                if(p == 2 && p1==a[p2].r) continue;
                if(p==1)solve_l();
                else if(p==2)solve_r();
                else if(p==3)solve_c();
            }
        }
        int x=0;
        ll sum=0;
        for(int i=1; i<=n; i++)
        {
            x=a[x].r;
            if(i&1)sum+=((ll)x);
        }
        if((der)&&(!(n&1))){
            sum=(n*(n+1)/2ll)-sum;///这里加了个long long WA!
        }
        printf("Case %d: %lld\n",coun++,sum);
    }
    return 0;
}

你可能感兴趣的:(一行盒子 (模拟) 13年湖南省赛题)