求助
查看原帖
求助
497018
R0075楼主2021/9/19 14:50
#include <cstdio>
#include <algorithm>

int main()
{
    int left[100005], right[100005];
    int n, m;
    int i, k, l = 0;
    long long j;
    int a, b;
    while (~scanf("%d %d", &n, &m))
    {
        for (i = 1; i <= n; ++i)
        {
            left[i] = i - 1;
            right[i] = i + 1;
        }
        right[0] = 1;
        left[n + 1] = n;
        for (i = 0; i < m; ++i)
        {
            scanf("%d", &a);
            switch(a)
            {
            case 1:
                scanf("%d %d", &a, &b);
                right[left[a]] = right[a];
                left[right[a]] = left[a];
                left[a] = left[b];
                right[a] = b;
                right[left[b]] = a;
                left[b] = a;
                break;
            case 2:
                scanf("%d %d", &a, &b);
                right[left[a]] = right[a];
                left[right[a]] = left[a];
                left[a] = b;
                right[a] = right[b];
                left[right[b]] = a;
                right[b] = a;
                break;
            case 3:
                scanf("%d %d", &a, &b);
                if (right[a] == b)
                {
                    right[left[a]] = b;
                    left[right[b]] = a;
                    right[a]  =right[b];
                    left[b] = left[a];
                    left[a] = b;
                    right[b] = a;
#ifdef DEBUG
                    printf("case 3 1\n");
#endif
                }
                else if (left[a] == b)
                {
                    right[left[b]] = a;
                    left[right[a]] = b;
                    left[a] = left[b];
                    right[b] = right[a];
                    right[a] = b;
                    left[b] = a;
#ifdef DEBUG
                    printf("case 3 2\n");
#endif
                }
                else
                {
                    right[left[a]] = b;
                    left[right[a]] = b;
                    right[left[b]] = a;
                    left[right[b]] = a;
                    std::swap(left[a], left[b]);
                    std::swap(right[a], right[b]);
#ifdef DEBUG
                    printf("case 3 3\n");
#endif
                }
                break;
            case 4:
                for (i = 0; i <= n + 1; ++i)
                {
                    std::swap(left[i], right[i]);
                }
                break;
            }
        }
        for (i = 1; i <= n; ++i)
        {
            if (!left[i] || left[i] == n + 1)
            {
                break;
            }
        }

        for (j = 0, k = 1; i > 0 && i <= n; ++k)
        {
#ifdef DEBUG
        printf("%d ", i);
#endif
            if (k % 2)
            {
                j += i;
            }
            i = right[i];
        }
        printf("Case %d: %lld\n", ++l, j);
    }
    
}

RE了,完全想不到,5555

2021/9/19 14:50
加载中...