UVA

来源:互联网 发布:数据库整型 编辑:程序博客网 时间:2024/06/07 08:57
#include<cstdio>#include<cstring>using namespace std;int left[100005], right[100005]; void link(int l, int r)             {    left[r] = l;  right[l] = r;} int main(){    int test = 0, op, x, y, temp, n, m;    while (scanf ("%d %d", &n, &m) != EOF)    {        for (int i = 1; i <= n; ++i)        {        right[i] = i + 1;left[i] = i - 1;}         right[n] = 0, left[0] = n, right[0] = 1;        int reverse = 0;                             while (m--)        {            scanf ("%d", &op);            if (op == 4)  reverse = !reverse;            else            {                scanf ("%d %d", &x, &y);                if ( reverse && op != 3){op = 3 - op; //翻转之后操作一变为把x移到y后面,操作二变为把x移到y前面。 }                 if (right[y] == x && op == 3)   {temp = x; x = y; y = temp; }                                         if ( (op == 1 && left[y] == x) || (op == 2 && right[y] == x))  continue;                 if (op == 1)  {link (left[x], right[x]);link (left[y], x);link (x, y); }                                                       else if (op == 2)  {link (left[x], right[x]); link (x, right[y]);  link (y, x);}                                                   else  if (y == right[x])  {link (left[x], y);link (x, right[y]);link (y, x);}                                             else                                           {                    int ry = right[y], ly = left[y];                    link (left[x], y); link (y, right[x]);  link (ly, x);  link (x, ry);                }            }        }         int t = 0; long long ans = 0;        for (int i = 1; i <= n; ++i)        {            t = right[t];            if (i % 2) ans += t;        }        if (n % 2 == 0 && reverse)    //偶数位的和            ans = (long long) n / 2 * (1 + n) - ans;        printf ("Case %d: %lld\n", ++test, ans);    }    return 0;}