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

来源:互联网 发布:域名需要实名认证吗 编辑:程序博客网 时间:2024/05/31 06:22

好伤心啊 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;}
1 0
原创粉丝点击