bnu 33967 Boxes in a Line 链表模拟

来源:互联网 发布:ones刻录软件 编辑:程序博客网 时间:2024/05/29 03:06
#include<algorithm>#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<vector>#include <cstdlib>#include <queue>#define REP(i, n) for(int i=0; i<n; i++)#define FF(i, a, b) for(int i=a; i<b; i++)#define FD(i, a, b) for(int i=a; i>=b; i--)#define CLR(a, b) memset(a, b, sizeof(a))#define PB push_backusing namespace std;const int maxn = 100010;const int INF = 100000007;typedef long long LL;int l[maxn], r[maxn];int n, m;int rev;void init(){    REP(i, n + 2)///!!!0        l[i] = i - 1;    FD(i, n + 1, 0)        r[i] = i + 1;    r[n + 1] = -1;///!!!n + 1}void _remove(int x)///remove x{    int lx = l[x];    int rx = r[x];    r[lx] = rx;    l[rx] = lx;}void _insert(int x, int y)///insert x to the left of y{    int z = l[y];    r[z] = x;    l[y] = x;    l[x] = z;    r[x] = y;}int nc;void solve(){    int op, x, y, z;    int lx, ly, rx, ry;    rev = 0;    while (m--)    {        scanf("%d", &op);        if ((op == 1 && !rev) || (op == 2 && rev))        {            scanf("%d%d", &x, &y);            if (l[y] != x)            {                _remove(x);                _insert(x, y);            }        }        else if ((op == 2 && !rev) || (op == 1 && rev))        {            scanf("%d%d", &x, &y);            if (r[y] != x)            {                _remove(x);                _insert(x, r[y]);            }        }        else if (op == 3)        {            scanf("%d%d", &x, &y);            if (r[x] == y)            {                _remove(x);                _insert(x ,r[y]);            }            else if (l[x] == y)            {                _remove(x);                _insert(x, y);            }            else            {                rx = r[x];                ry = r[y];                _remove(x); _insert(x, ry);                _remove(y); _insert(y, rx);            }        }        else rev ^= 1;    }    long long ans = 0;    int isget, id;    if (rev)    {        isget = 1;        id = l[n + 1];        while (id != 0)        {            ans += isget * id;            id = l[id];            isget ^= 1;        }    }    else    {        isget = 1;        id = r[0];        while (id != n + 1)        {            ans += isget * id;            id = r[id];            isget ^= 1;        }    }    printf("Case %d: ", nc++);    printf("%lld\n", ans);}int main(){    int x, y;    nc = 1;    while (~scanf("%d%d", &n, &m))    {        init();        solve();    }}