uva12657

#include "cstdio"
#include "stdlib.h"
#include "cstring"
#include "iostream"
#include "vector"
#include  "deque"
#include "stack"
#include "string"
#include "sstream"
using namespace std;

int n, m;
int cmd;
int op1, op2;
bool rever;
int kase;

struct Node
{
    int l;
    int r;
};
Node nodes[100010];

void pickNode(int i)
{
    int r = nodes[i].r;
    int l = nodes[i].l;

    nodes[r].l = l;
    nodes[l].r = r;
}

void addLeft(int target, int i)
{
    int l = nodes[target].l;
    nodes[i].r = target;
    nodes[target].l = i;
    nodes[i].l = l;
    nodes[l].r = i;
}


void addRight(int target, int i)
{
    int r = nodes[target].r;
    nodes[i].l = target;
    nodes[target].r = i;
    nodes[i].r = r;
    nodes[r].l = i;
}

void printsNodes()
{
    if (!rever)
    {
        int i = 0;
        while (nodes[i].r != n + 1)
        {
            i = nodes[i].r;
            cout << i << " ";
        }
        cout << endl;
    }
    else{
        int i = n + 1;
        while (nodes[i].l != 0)
        {
            i = nodes[i].l;
            cout << i << " ";
        }
        cout <<  endl;

    }


}

int main()
{
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    
    while (cin >> n && cin >> m)
    {
        rever = false;
        for (int i = 1; i <= n; i++)
        {
            nodes[i].r = i + 1;
            nodes[i].l = i - 1;
        }
        nodes[0].r = 1;
        nodes[n + 1].l = n;

        for (int i = 0; i < m; i++)
        {
            cin >> cmd;
            int l, r;
            if ((cmd == 1 || cmd == 2) && rever)
            {
                cmd = 3 - cmd;
            }
            switch (cmd)
            {
            case 1:
                cin >> op1 >> op2;
                if (nodes[op1].r != op2)
                {
                    pickNode(op1);
                    addLeft(op2, op1);
                }

                break;
            case 2:
                cin >> op1 >> op2;
                if (nodes[op1].l != op2)
                {
                    pickNode(op1);
                    addRight(op2, op1);
                }
                break;
            case 3:
                cin >> op1 >> op2;
                r = nodes[op1].r;
                if (r != op2)
                {
                    pickNode(op1);
                    addLeft(op2, op1);
                    pickNode(op2);
                    addLeft(r, op2);
                }
                else{
                    pickNode(op2);
                    addLeft(op1,op2);
                }

                break;
            case 4:
                rever = !rever;
                break;
            default:
                break;
            }
            //if (kase == 0)
            //    printsNodes();
        }

        kase++;
        cout << "Case " << kase << ": ";
        long long sum = 0;

        if (rever)
        {
            int i = nodes[n + 1].l;
            int cnt = 1;
            while (i != 0)
            {
                if (cnt % 2)
                {
                    sum += i;
                }
                i = nodes[i].l;
                cnt++;
            }
        }
        else{
            int i = nodes[0].r;
            int cnt = 1;
            while (i != n + 1)
            {
                if (cnt % 2)
                {
                    sum += i;
                }
                i = nodes[i].r;
                cnt++;
            }
        }
        cout << sum << endl;
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值