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

    题目链接:https://vjudge.net/problem/UVA-12657

    题目大意

      你有n个盒子在桌子上的一条线上从左到右编号为1……n。你的任务是模拟四种操作

    1. X Y 移动盒子编号X到盒子编号Y的左边(如果X已经在Y的左边了就忽略)
    2. X Y 移动盒子编号X到盒子编号Y的右边(如果X已经在Y的右边了就忽略)
    3. X Y 交换盒子编号X与盒子编号Y的位置
    4. 将整条线反转

      操作保证合法,X不等于Y

      举一个例子,如果n=6,操作 1 1 4然后就变成了2 3 1 4 5 6;再操作 2 3 5就变成了 2 1 4 5 3 6;再操作 3 1 6 就变成 2 6 4 5 3 1;最后操作4,就变成了 1 3 5 4 6 2

      输入

        最多有10组数据,每个数据会包含两个整数n,m(1≤n,m<100,000), 接下来是m行数据,表示操作。

      输出

        对于每组数据,输出他们奇数位置的编号的和。

      翻译搬运自洛谷。

    分析

      静态链表模板题。

    代码如下

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3  
      4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
      5 #define Rep(i,n) for (int i = 0; i < (n); ++i)
      6 #define For(i,s,t) for (int i = (s); i <= (t); ++i)
      7 #define rFor(i,t,s) for (int i = (t); i >= (s); --i)
      8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i)
      9 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i)
     10 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
     11 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i)
     12  
     13 #define pr(x) cout << #x << " = " << x << "  "
     14 #define prln(x) cout << #x << " = " << x << endl
     15  
     16 #define LOWBIT(x) ((x)&(-x))
     17  
     18 #define ALL(x) x.begin(),x.end()
     19 #define INS(x) inserter(x,x.begin())
     20  
     21 #define ms0(a) memset(a,0,sizeof(a))
     22 #define msI(a) memset(a,inf,sizeof(a))
     23 #define msM(a) memset(a,-1,sizeof(a))
     24 
     25 #define MP make_pair
     26 #define PB push_back
     27 #define ft first
     28 #define sd second
     29  
     30 template<typename T1, typename T2>
     31 istream &operator>>(istream &in, pair<T1, T2> &p) {
     32     in >> p.first >> p.second;
     33     return in;
     34 }
     35  
     36 template<typename T>
     37 istream &operator>>(istream &in, vector<T> &v) {
     38     for (auto &x: v)
     39         in >> x;
     40     return in;
     41 }
     42  
     43 template<typename T1, typename T2>
     44 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) {
     45     out << "[" << p.first << ", " << p.second << "]" << "
    ";
     46     return out;
     47 }
     48 
     49 inline int gc(){
     50     static const int BUF = 1e7;
     51     static char buf[BUF], *bg = buf + BUF, *ed = bg;
     52     
     53     if(bg == ed) fread(bg = buf, 1, BUF, stdin);
     54     return *bg++;
     55 } 
     56 
     57 inline int ri(){
     58     int x = 0, f = 1, c = gc();
     59     for(; c<48||c>57; f = c=='-'?-1:f, c=gc());
     60     for(; c>47&&c<58; x = x*10 + c - 48, c=gc());
     61     return x*f;
     62 }
     63  
     64 typedef long long LL;
     65 typedef unsigned long long uLL;
     66 typedef pair< double, double > PDD;
     67 typedef pair< int, int > PII;
     68 typedef pair< string, int > PSI;
     69 typedef set< int > SI;
     70 typedef vector< int > VI;
     71 typedef vector< VI > VVI;
     72 typedef vector< PII > VPII;
     73 typedef map< int, int > MII;
     74 typedef multimap< int, int > MMII;
     75 typedef unordered_map< int, int > uMII;
     76 typedef pair< LL, LL > PLL;
     77 typedef vector< LL > VL;
     78 typedef vector< VL > VVL;
     79 typedef priority_queue< int > PQIMax;
     80 typedef priority_queue< int, VI, greater< int > > PQIMin;
     81 const double EPS = 1e-10;
     82 const LL inf = 0x7fffffff;
     83 const LL infLL = 0x7fffffffffffffffLL;
     84 const LL mod = 1e9 + 7;
     85 const int maxN = 1e5 + 7;
     86 const LL ONE = 1;
     87 const LL evenBits = 0xaaaaaaaaaaaaaaaa;
     88 const LL oddBits = 0x5555555555555555;
     89 
     90 struct StaticList{
     91     int sl[maxN], nt[maxN], pv[maxN];
     92     int *next = nt, *prev = pv;
     93     int sz;
     94     
     95     void init(int x) {
     96         sz = x;
     97         For(i, 0, sz) {
     98             if(i) sl[i] = i;
     99             prev[i] = (sz + i) % (sz + 1);
    100             next[i] = (i + 1) % (sz + 1);
    101         }
    102     }
    103     
    104     // 把 x 插到 y 前面 
    105     void move(int x, int y) {
    106         if(y == x || next[x] == y) return;
    107         next[prev[x]] = next[x];
    108         prev[next[x]] = prev[x];
    109         
    110         next[prev[y]] = x;
    111         prev[x] = prev[y];
    112         next[x] = y;
    113         prev[y] = x;
    114     }
    115     
    116     void Swap(int x, int y) {
    117         // 如果两个节点相邻,要单独讨论 
    118         if(next[x] == y || prev[x] == y) {
    119             if(prev[x] == y) swap(x, y);
    120             swap(next[prev[x]], prev[next[y]]);
    121             next[x] = next[y];
    122             prev[y] = prev[x];
    123             prev[x] = y;
    124             next[y] = x;
    125             return;
    126         }
    127         
    128         swap(next[prev[x]], next[prev[y]]);
    129         swap(prev[next[x]], prev[next[y]]);
    130         swap(prev[x], prev[y]);
    131         swap(next[x], next[y]);
    132     }
    133     
    134     void reverse(){
    135         swap(prev, next);
    136     }
    137     
    138     LL getAns() {
    139         LL ret = 0;
    140         int p = next[0];
    141         
    142         while(p != 0) {
    143             ret += sl[p];
    144             p = next[p];
    145             if(p == 0) break;
    146             p = next[p];
    147         }
    148         
    149         return ret;
    150     }
    151     
    152     void print() {
    153         cout << "SL:  ";
    154         For(i, 0, sz) cout << " " << sl[i];
    155         cout << endl;
    156         
    157         cout << "prev:";
    158         For(i, 0, sz) cout << " " << prev[i];
    159         cout << endl;
    160         
    161         cout << "next:";
    162         For(i, 0, sz) cout << " " << next[i];
    163         cout << endl;
    164         
    165     }
    166 }SL;
    167 
    168 int n, m, T;
    169 
    170 int main(){
    171     //freopen("MyOutput.txt","w",stdout);
    172     INIT();
    173     while(cin >> n >> m) {
    174         ++T;
    175         SL.init(n);
    176         Rep(i, m) {
    177             int t, x, y;
    178             cin >> t;
    179             if(t == 4) SL.reverse();
    180             else {
    181                 cin >> x >> y;
    182                 switch(t) {
    183                     case 1:{
    184                         SL.move(x, y);
    185                         break;
    186                     }
    187                     case 2:{
    188                         SL.move(x, SL.next[y]);
    189                         break;
    190                     }
    191                     case 3:{
    192                         SL.Swap(x, y);
    193                         break;
    194                     }
    195                 }
    196             }
    197             //SL.print();
    198         }
    199         //SL.print();
    200         cout << "Case " << T << ": " << SL.getAns() << endl;
    201     }
    202     return 0;
    203 }
    View Code
  • 相关阅读:
    一致性hash算法
    运算符的重载
    HTTP协议详解
    SOA 新业务语言 新系统架构——什么是SOA
    js中几种实用的跨域方法原理详解
    Linq基于两个属性的分组
    BackBone结合ASP.NET MVC实现页面路由操作
    CSS学习总结
    单页应用 WebApp SPA 骨架 框架 路由 页面切换 转场
    2016年最值得学习的五大开源项目
  • 原文地址:https://www.cnblogs.com/zaq19970105/p/10962033.html
Copyright © 2011-2022 走看看