RE 20pts 求调
查看原帖
RE 20pts 求调
533854
CodingShark楼主2023/11/8 21:38

rt,石山代码调了两个多小时了(

#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int T, n, m, k, a[N], top[605], bot[605], emp, op[N], id1[N], id2[N], pos;
deque<int> stk[605], lst;
int push(int val) {
    if (top[val]) {
        int idx = top[val];
        top[val] = bot[val] = 0;
        op[++pos] = 1, id1[pos] = idx;
        stk[idx].pop_back();
        if (stk[idx].size()) {
            top[stk[idx].back()] = idx;
            lst.push_back(idx);
        } return 1;
    } else if (bot[val]) {
        int idx = bot[val];
        top[val] = bot[val] = 0;
        op[++pos] = 1, id1[pos] = emp;
        op[++pos] = 2, id1[pos] = idx, id2[pos] = emp;
        stk[idx].pop_front();
        if (stk[idx].size()) {
            bot[stk[idx].front()] = idx;
            lst.push_front(idx);
        } return 2;
    } else {
        if (!lst.size()) return 0;
        int idx = lst.front();
        lst.pop_front();
        if (stk[idx].size()) top[stk[idx].back()] = 0;
        op[++pos] = 1, id1[pos] = idx;
        stk[idx].push_back(val);
        top[val] = idx;
        if (stk[idx].size() == 1) bot[val] = idx;
        if (stk[idx].size() < 2) lst.push_front(idx);
        return 3;
    }
}
int main() {
    scanf("%d", &T);
    while (T--) {
        while (lst.size()) lst.pop_back();
        pos = 0;
        memset(top, 0, sizeof top);
        memset(bot, 0, sizeof bot);
        scanf("%d%d%d", &n, &m, &k);
        for (int i = 1; i <= n; i++) while (stk[i].size()) stk[i].pop_back();
        for (int i = 1; i <= m; i++) scanf("%d", a + i);
        for (int i = 1; i < n; i++) lst.push_back(i);
        emp = n;
        for (int i = 1; i <= m; i++) {
            int t = push(a[i]);
            if (!t) {
                int j = i + 1, cnt = 0;
                while (!bot[a[j]] && a[j] != a[i]) j++;
                if (a[i] == a[j]) {
                    op[++pos] = 1, id1[pos] = emp;
                    for (int k = i + 1; k < j; k++) push(a[k]);
                    op[++pos] = 1, id1[pos] = emp;
                } else {
                    int idx = bot[a[j]];
                    for (int k = i + 1; k < j; k++)
                        if (a[k] == stk[idx].back()) cnt++;
                    if (cnt & 1) {
                        op[++pos] = 1, id1[pos] = emp;
                        for (int k = i + 1; k < j; k++) {
                            if (a[k] == stk[idx].back()) op[++pos] = 1, id1[pos] = idx;
                            else push(a[k]);
                        }
                        top[stk[idx].back()] = 0;
                        stk[idx].pop_back();
                        op[++pos] = 1, id1[pos] = idx;
                        bot[stk[idx].back()] = 0;
                        stk[idx].pop_back();
                        top[a[i]] = bot[a[i]] = emp;
                        lst.push_back(emp);
                        emp = idx;
                    } else {
                        op[++pos] = 1, id1[pos] = idx;
                        for (int k = i + 1; k < j; k++) {
                            if (a[k] == stk[idx].back()) op[++pos] = 1, id1[pos] = emp;
                            else push(a[k]);
                        }
                        op[++pos] = 1, id1[pos] = emp;
                        op[++pos] = 2, id1[pos] = idx, id2[pos] = emp;
                        bot[stk[idx].front()] = 0;
                        stk[idx].pop_front();
                        top[stk[idx].front()] = 0;
                        bot[stk[idx].front()] = idx;
                        stk[idx].push_back(a[i]);
                        top[stk[idx].front()] = idx;
                    }
                } i = j;
            }
        }
        printf("%d\n", pos);
        for (int i = 1; i <= pos; i++) {
            if (op[i] == 1) printf("1 %d\n", id1[i]);
            else printf("2 %d %d\n", id1[i], id2[i]);
        }
    }
    return 0;
}
2023/11/8 21:38
加载中...