Test instructions
You have a row of boxes, numbered 1, 2, 3,..., n from left to right. You can perform the following 4 types of directives:
1 x y means to move the box X to the left of Box y (if X is already on the left side of Y ignore this directive).
2 x y means to move the box X to the right of Box Y (if X is already on the right side of Y ignore this directive).
3 x y indicates the position of the swap box X and Y.
4 indicates that the entire chain is reversed.
Analysis:
From the point of view of operation, there needs to be a data structure that records what is on the left and right side of each box.
Operation 4 If the simulation is really high complexity is also more troublesome, you can consider building a tag, indicating that there is no action performed 4
But note that if Operation 4 is performed, if the Operation 1 2 does not change, then the Operation 1 is 2,2 1 (left + invert = on the right)
The doubly linked list has a more practical function
The meaning is to connect the L,r two elements, L on the left of R, R on the right of L.
1#include <bits/stdc++.h>2 Const intMAXN =100000+7;3 intN, Left[maxn], RIGHT[MAXN];4 voidLinkintLintR) {//The first parameter is L, the second is R,5RIGHT[L] =R;6LEFT[R] =L;7 }8 intMain ()9 {Ten intM, Kase =0; One while(SCANF ("%d%d", &n, &m) = =2){ A for(inti =1; I <= N; i++){ -Left[i] = i-1; -Right[i] = (i+1)% (n+1); the } -right[0] =1;//Note 0 Right is 1 Left is n -left[0] =N; - intOP, X, Y, INV =0; + while(m--){ -scanf"%d", &op); + if(OP = =4) INV =!INV; A Else { atscanf"%d%d", &x, &Y); - if(OP = =3&& Right[y] = =X) - Std::swap (x, y); - if(OP! =3&& Inv) op =3-op; - if(OP = =1&& X = = Left[y])Continue; - if(OP = =2&& X = = Right[y])Continue; in - intLX = Left[x], RX = right[x], LY = Left[y], RY =Right[y]; to if(OP = =1){ + Link (lx,rx); link ( ly,x); link (x, y); - } the Else if(OP = =2){ * Link (lx,rx); link ( y,x); link (x,ry) ; $ }Panax Notoginseng Else if(OP = =3){ - if(Right[x] = =Y) { the link (lx,y); link (y,x); + link (x,ry); A } the Else { + link (lx,y); - link (y,rx); $ link (ly,x); $ link (x,ry); - } - } the } - }Wuyi intb =0; the Long LongAns =0; - for(inti =1; I <= N; i++){ Wub =Right[b]; - ifI2==1) ans + =b; About } $ if(INV && n%2==0) ans = (Long Long) n * (n+1)/2-ans; -printf"Case %d:%lld\n", ++Kase, ans); - } -}
Uva 12657 Mobile box (doubly linked list)