• UVA 12657 Boxes in a Line


    双向链表

    注意:如果算法是最后处理翻转情况时,注意指令4翻转后1,2两个指令也要翻转处理;

       指令3 中交换盒子要注意两个盒子相邻的情况

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 int ri[100010],le[100010];
     6 
     7 void link (int l,int r){
     8     ri[l]=r;le[r]=l;
     9 }
    10 
    11 void moveleft (int l,int r){
    12     link (le[l],ri[l]);
    13     link (le[r],l);
    14     link (l,r);
    15 }
    16 
    17 void moveright (int l,int r){
    18     link (le[l],ri[l]);
    19     link (l,ri[r]);
    20     link (r,l);
    21 }
    22 
    23 void exchange (int l,int r){
    24     int ll,rl,lr,rr;
    25     ll=le[l];rl=ri[l];lr=le[r];rr=ri[r];
    26     if (ll==r){
    27         link (lr,l);link (l,r);link (r,rl);
    28     }
    29     else if (l==lr){
    30         link (ll,r);link (r,l);link (l,rr);
    31     }
    32     else {
    33         link (ll,r);link (r,rl);
    34         link (lr,l);link (l,rr);
    35     }
    36 }
    37 
    38 int main (){
    39     int n,m,kase=0,inv;
    40     while (cin>>n>>m){
    41         inv=0;
    42         memset (ri,0,sizeof ri);
    43         memset (le,0,sizeof le);
    44         for (int i=0;i<=n;i++)
    45             link (i,i+1);
    46         for (int i=0;i<m;i++){
    47             int c;
    48             cin>>c;
    49             if (c==4)
    50                 inv++;
    51             else {
    52                 int x,y;
    53                 cin>>x>>y;
    54                 if (x==y)
    55                     continue ;
    56                 if (inv%2)  //经过指令4后指令1,2也要翻转处理;
    57                     c=3-c;  
    58                 if (c==1){
    59                     moveleft (x,y);
    60                 }
    61                 else if (c==2){
    62                     moveright (x,y);
    63                 }
    64                 else {
    65                     exchange (x,y);
    66                 }
    67             }
    68             //int temp=0;
    69             //for (int i=ri[0];i<=n&&temp<n;i=ri[i]){
    70             //    cout<<i<<" ";
    71             //    temp++;
    72             //}
    73         }
    74         long long ans=0;
    75         int f;
    76         if (n%2)
    77             f=0;
    78         else f=inv%2;
    79         int temp=0;
    80         for (int i=ri[0];i<=n&&temp<n;i=ri[i]){// cout<<ri[i]<<" ";
    81             if (temp%2==f){
    82                 ans+=i;
    83             }
    84             temp++;
    85         }
    86         cout<<"Case "<<++kase<<": ";
    87         cout<<ans<<endl;
    88     }
    89     return 0;
    90 }
  • 相关阅读:
    python 二进制加法
    python性能测试值timeit的使用示例
    Java和python中的面向对象
    python itern机制的
    Python选择指定文件夹的文件然后复制出其中几个文件到新的文件夹
    软件开发中什么是CI/CD
    python 列表切片之负数的含义代码示例
    python 找出数组重复的元素
    python位运算版的算术四则运算
    [转载]逐步建设企业DevOps能力
  • 原文地址:https://www.cnblogs.com/gfc-g/p/3853832.html
Copyright © 2020-2023  润新知