zoukankan      html  css  js  c++  java
  • UVA 12657 Boxes in a Line

    题意:

      给出一个数n,表示存在一个整数序列1……n,然后进行四种操作:操作一:输入x,y,表示将x移到y的左边(若x本来就在y的左边则忽略);操作二:输入x,y,表示将x移到y的右边(若x本来就在y的右边则忽略);操作三:输入x,y,表示交换x和y。操作四:将整个序列倒置。最后要求的是操作后的整个序列奇数项的和。

    分析:

      用数组模拟链表,left[i]和right[i]数组分别存放i的左值和右值。在整个过程中,逆序操作不进行,而改为再逆序后输入的操作1变为操作2,输入的操作2变为操作1。

    代码:

      

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    const int N=100005;
    int l[N],r[N],n,m;
    void link(int L,int R)
    {
    r[L]=R;
    l[R]=L;
    }
    int main()
    {
    int kase=0;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
    int i,j,k;
    for(i=1;i<=n;i++)
    l[i]=i-1,r[i]=(i+1)%(n+1);
    r[0]=1;l[0]=n;
    int op,x,y,inv=0;
    while(m--)
    {
    scanf("%d",&op);
    if(op==4)
    inv=!inv;
    else
    {
    scanf("%d%d",&x,&y);
    if(op==3&&r[y]==x)
    {
    swap(x,y);
    }
    if(op!=3&&inv)
    op=3-op;
    if(op==1&&x==l[y])
    {
    continue;
    }
    if(op==2&&x==r[y])
    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(op==3)
    {
    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 b=0;
    long long ans=0;
    for(i=1;i<=n;i++)
    {
    b=r[b];
    if(i%2==1)
    ans+=b;
    }
    if(inv&&n%2==0)
    ans=(long long)n*(n+1)/2-ans;
    printf("Case %d: %lld ",++kase,ans);
    }
    }
  • 相关阅读:
    使用XMLReader读XML
    C#命名空间大全详细教程
    C# using 三种使用方式
    SVN服务器搭建
    简单的自定义Session
    python学习第十八天 --错误&异常处理
    锁的等级:方法锁、实例锁、类锁
    java线程池如何合理的设置大小
    挖掘两个Integer对象的swap的内幕
    实现线程同步的方式
  • 原文地址:https://www.cnblogs.com/137033036-wjl/p/4875635.html
Copyright © 2011-2022 走看看