QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#344257#5508. Job for a Hobbitucup-team1198#WA 7ms5392kbC++205.2kb2024-03-03 20:59:332024-03-03 20:59:33

Judging History

你现在查看的是最新测评结果

  • [2024-03-03 20:59:33]
  • 评测
  • 测评结果:WA
  • 用时:7ms
  • 内存:5392kb
  • [2024-03-03 20:59:33]
  • 提交

answer

#include <map>
#include <set>
#include <array>
#include <cmath>
#include <deque>
#include <bitset>
#include <random>
#include <string>
#include <vector>
#include <cassert>
#include <complex>
#include <iomanip>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>

using namespace std;

const int MAXN = 60, MAXK = 11;
vector<int> st[MAXN];
int col[MAXN * MAXK];

vector<array<int, 2>> ans;

int n, k;

void mv(int i, int j) {
    ans.push_back({i, j});
    st[j].push_back(st[i].back());
    st[i].pop_back();
}

int block[MAXN * MAXK];

void mv_all(int i, int j) {
    while (!st[i].empty()) {
        mv(i, j);
    }
}

void move_up(int i, int b) {
    while (!st[i].empty()) {
        if (block[st[i].back()] == b) {
            mv(i, i - 1);
        } else {
            mv(i, i + 1);
        }
    }
    mv_all(i + 1, i);
    mv_all(i - 1, i);
} 

void move_down(int i, int b) {
    while (!st[i].empty()) {
        if (block[st[i].back()] == b) {
            mv(i, i - 1);
        } else {
            mv(i, i + 1);
        }
    }
    mv_all(i - 1, i);
    mv_all(i + 1, i);
}

void move_right(int i, int b) {
    move_up(i, b);
    mv_all(i + 2, i + 1);
    mv_all(i, i - 1);
    move_up(i + 1, b);
    mv_all(i - 1, i);
    if (block[st[i + 1].back()] != b && block[st[i].back()] != b) {
        mv_all(i, i - 1);
        return;
    }
    if (block[st[i + 1].back()] != b) {
        mv(i + 1, i + 2);
        mv(i + 1, i + 2);
        mv(i, i + 1);
        mv(i + 2, i + 1);
        mv(i + 1, i);
        mv(i + 2, i + 1);

        mv_all(i + 1, i + 2);
        move_up(i, b);
        mv_all(i + 2, i + 1);
        mv_all(i, i - 1);
        move_up(i + 1, b);
        mv_all(i - 1, i);
    }
    while (!st[i + 1].empty() && block[st[i + 1].back()] == b) {
        mv(i + 1, i + 2);
    }
    while (!st[i].empty() && block[st[i].back()] == b) {
        mv(i, i + 1);
        mv(i + 1, i + 2);
    }
    while (st[i].size() < k) {
        mv(i + 1, i);
    }
    mv_all(i + 2, i + 1);
    mv_all(i, i - 1);
}

void solve() {
    ans.clear();
    cin >> n >> k;
    // bottom to top

    map<int, vector<int>> rep;

    for (int i = 1; i <= n; ++i) {
        st[i].resize(k);
        for (int j = 0; j < k; ++j) {
            st[i][j] = (i - 1) * k + j;
            cin >> col[(i - 1) * k + j];
            rep[col[(i - 1) * k + j]].push_back((i - 1) * k + j);
        }
    }
    st[0].clear();
    st[n + 1].clear();
    if (k == 1) {
        cout << "TAK\n0\n";
        return;
    }
    fill(block, block + n * k, -1);
    int curb = 0;
    vector<int> lft;
    for (auto& elem : rep) {
        while (elem.second.size() >= k) {
            for (int i = 0; i < k; ++i) {
                block[elem.second.back()] = curb;
                elem.second.pop_back();
            }
            ++curb;
        }
        if (!elem.second.empty()) {
            lft.push_back(elem.first);
        }
    }
    if (lft.size() > n + 2 - curb) {
        cout << "NIE\n";
        return;
    }
    vector<int> garbage;
    vector<int> last;
    while (lft.size() > n - curb) {
        int x = lft.back();
        last.push_back(x);
        for (int t : rep[x]) {
            garbage.push_back(t);
        }
        lft.pop_back();
    }
    while (last.size() < 2) last.push_back(-1);
    for (int x : lft) {
        int cnt = 0;
        for (int i : rep[x]) {
            block[i] = curb;
            ++cnt;
        }
        while (cnt < k) {
            block[garbage.back()] = curb;
            garbage.pop_back();
            ++cnt;
        }
        ++curb;
    }

    for (int i = n + 1; i > 1; --i) {
        mv_all(i - 1, i);
    }

    for (int i = 0; i < n; ++i) {
        mv_all(2, 1);
        for (int t = 0; t < n - 1 - i; ++t) {
            move_right(t + 1, i);
        }
        int pos = n - i;
        for (int x : st[pos]) {
            if (col[x] == last[0]) {
                block[x] = 0;
            } else if (col[x] == last[1]) {
                block[x] = 1;
            } else {
                block[x] = 2;
            }
        }
        move_down(pos, 1);
        move_down(pos, 0);
        for (int t = pos - 1; t > 0; --t) {
            mv_all(t - 1, t);
        }
        for (int t = pos + 1; t > 1; --t) {
            mv_all(t - 1, t);
        }
    }
    for (int i = 2; i < n + 2; ++i) {
        while (col[st[i].back()] == last[0]) {
            for (int t = i; t > 0; --t) {
                mv(t, t - 1);
            }
        }
    }
    for (int i = 2; i < n + 2; ++i) {
        while (col[st[i].back()] == last[1]) {
            for (int t = i; t > 1; --t) {
                mv(t, t - 1);
            }
        }
    }

    assert((int)ans.size() <= 1'000'000);

    cout << "TAK\n";
    cout << ans.size() << "\n";
    for (auto elem : ans) {
        cout << elem[0] << " " << elem[1] << "\n";
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3596kb

input:

2
2 2
1 2
2 1
1 4
1 2 3 4

output:

TAK
54
2 3
2 3
1 2
1 2
2 1
2 1
1 2
1 0
2 1
0 1
3 2
3 2
1 0
1 0
2 1
2 3
3 2
1 2
0 1
0 1
2 3
1 2
2 3
2 1
3 2
3 2
1 0
1 0
2 3
2 3
3 2
3 2
2 3
2 3
3 2
3 2
0 1
0 1
2 3
2 3
1 2
1 2
2 1
2 1
1 2
1 2
2 1
2 1
1 2
1 2
2 1
2 1
1 2
1 2
NIE

result:

ok Correct! Used 54 swaps

Test #2:

score: 0
Accepted
time: 1ms
memory: 3868kb

input:

25
2 7
4 1 2 2 3 2 4
4 4 6 4 2 2 5
2 5
6 5 5 3 3
1 6 5 2 5
2 8
1 4 2 1 4 1 2 1
1 3 4 4 2 2 1 2
2 4
1 1 5 2
1 5 2 2
2 10
3 5 4 5 5 2 1 3 5 2
5 2 2 1 5 1 3 3 4 2
2 8
2 4 3 3 4 2 1 2
5 1 4 1 2 6 3 4
2 9
4 3 4 3 4 2 4 1 2
2 4 4 2 2 3 3 3 4
2 4
4 1 3 1
4 2 4 3
2 4
5 1 2 2
2 4 3 2
2 7
1 2 4 5 2 5 2
4 5 5 ...

output:

NIE
NIE
TAK
227
2 3
2 3
2 3
2 3
2 3
2 3
2 3
2 3
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
1 0
1 2
1 0
1 2
1 0
1 2
1 2
1 0
2 1
2 1
2 1
2 1
0 1
0 1
0 1
0 1
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
2 3
2 1
2 3
2 3
2 1
2 3
2 1
2 1
3 2
3 2
3 2
3 2
1 2
1 2
1 2
...

result:

ok Correct! Used 1902 swaps

Test #3:

score: -100
Wrong Answer
time: 7ms
memory: 5392kb

input:

1
50 10
2 2 2 2 2 1 2 1 1 2
2 1 2 1 1 2 2 2 2 2
2 1 1 2 2 2 2 1 1 1
2 2 1 2 2 2 1 1 1 2
2 1 1 2 1 2 2 1 2 1
2 1 2 1 1 1 2 1 2 2
1 2 1 1 2 2 1 1 2 1
2 2 1 1 2 2 2 1 1 2
1 2 2 2 2 1 1 2 1 1
2 2 2 1 2 1 1 2 1 1
2 2 1 2 2 1 1 1 1 1
1 2 2 1 2 2 2 1 1 1
2 2 2 1 2 2 1 1 2 2
1 2 1 2 1 1 1 1 2 2
1 2 1 1 2 2 ...

output:

TAK
166183
50 51
50 51
50 51
50 51
50 51
50 51
50 51
50 51
50 51
50 51
49 50
49 50
49 50
49 50
49 50
49 50
49 50
49 50
49 50
49 50
48 49
48 49
48 49
48 49
48 49
48 49
48 49
48 49
48 49
48 49
47 48
47 48
47 48
47 48
47 48
47 48
47 48
47 48
47 48
47 48
46 47
46 47
46 47
46 47
46 47
46 47
46 47
46 47
4...

result:

wrong answer Trying to perform move: 162088, (1 -> 0), destination pillar full