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行数据,表示操作。

  输出

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

  翻译搬运自洛谷。

分析

  静态链表模板题。

代码如下

UVA 12657 Boxes in a Line
  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 << "]" << "\n";
 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

 

上一篇:opencv中的图像形态学——腐蚀膨胀


下一篇:UVA 210 Concurrency Simulator