NOIP T2 请问这样为啥爆零RE了
查看原帖
NOIP T2 请问这样为啥爆零RE了
135855
XenonWZH楼主2022/11/27 10:50

原本打算写 k=2n2k = 2n - 2 的点,然而全 RE

#include <bits/stdc++.h>

namespace XenonWZH {
    void solve() {
        int n, m, k;
        scanf("%d %d %d", &n, &m, &k);

        std::vector<int> a(m + 1);
        for (int i = 1; i <= m; i++) scanf("%d", &a[i]);

        std::vector<std::deque<int>> s(n + 1);
        std::vector<std::pair<int, int>> pos(k + 1, std::make_pair(0, 0));
        std::stack<int> remainB, remainT;
        std::vector<std::tuple<int, int, int>> ans;
        for (int i = 1; i <= n - 1; i++) {
            remainB.push(i);
            remainT.push(i);
        }

        for (int i = 1; i <= m; i++) {
            if (pos[a[i]] == std::make_pair(0, 0)) {
                if (!remainB.empty()) {
                    ans.emplace_back(1, remainB.top(), -1);
                    pos[a[i]] = std::make_pair(1, remainB.top());
                    s[remainB.top()].push_back(a[i]);
                    remainB.pop();
                } else if (!remainT.empty()) {
                    ans.emplace_back(1, remainT.top(), -1);
                    pos[a[i]] = std::make_pair(2, remainT.top());
                    s[remainT.top()].push_back(a[i]);
                    remainT.pop();
                } else {
                    ans.emplace_back(1, n, -1);
                    pos[a[i]] = std::make_pair(-1, n);
                }
            } else {
                if (pos[a[i]].first == -1) {
                    ans.emplace_back(1, n, -1);
                }else if (pos[a[i]].first == 1) {
                    ans.emplace_back(1, n, -1);
                    ans.emplace_back(2, pos[a[i]].second, n);
                    s[pos[a[i]].second].pop_front();
                } else {
                    ans.emplace_back(1, pos[a[i]].second, -1);
                    s[pos[a[i]].second].pop_back();
                }
                if (s[pos[a[i]].second].empty()) {
                    remainB.push(pos[a[i]].second);
                    remainT.push(pos[a[i]].second);
                } else pos[s[pos[a[i]].second].front()] = std::make_pair(1, pos[a[i]].second);
                pos[a[i]] = std::make_pair(0, 0);
            }
        }

        printf("%zu\n", ans.size());
        for (auto each : ans) {
            if (std::get<0>(each) == 1) printf("1 %d\n", std::get<1>(each));
            else printf("2 %d %d\n", std::get<1>(each), std::get<2>(each));
        }
    }

    int main() {
#ifndef DBG
        freopen("meow.in", "r", stdin);
        freopen("meow.out", "w", stdout);
#endif

        int t;
        scanf("%d", &t);

        while (t--) solve();

#ifndef DBG
        fclose(stdin);
        fclose(stdout);
#endif

        return 0;
    }
};

int main() {
    return XenonWZH::main();
}
2022/11/27 10:50
加载中...