QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#344267#5508. Job for a Hobbitucup-team1198AC ✓16ms5356kbC++205.7kb2024-03-03 21:29:102024-03-03 21:29:11

Judging History

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

  • [2024-03-03 21:29:11]
  • 评测
  • 测评结果:AC
  • 用时:16ms
  • 内存:5356kb
  • [2024-03-03 21:29:10]
  • 提交

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) {
    assert(st[i - 1].empty() && st[i + 1].empty());
    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) {
    assert(st[i - 1].empty() && st[i + 1].empty());
    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) {
    assert(st[i - 1].empty() && st[i + 1].empty());
    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;
                col[elem.second.back()] = -2;
                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);
        }
    }
    /// assert(st[0].empty());
    /// assert(st[1].empty());
    int cnt0 = 0, cnt1 = 0;
    for (int i = 0; i < n * k; ++i) {
        if (col[i] == last[0]) ++cnt0;
        if (col[i] == last[1]) ++cnt1;
    }
    /// assert(cnt0 < k && cnt1 < k);
    for (int i = 2; i < n + 2; ++i) {
        while (col[st[i].back()] == last[0] || col[st[i].back()] == last[1]) {
            int to = (col[st[i].back()] == last[1]);
            for (int t = i; t > to; --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;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 3616kb

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: 3592kb

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: 0
Accepted
time: 12ms
memory: 5236kb

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
162058
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:

ok Correct! Used 162058 swaps

Test #4:

score: 0
Accepted
time: 12ms
memory: 5356kb

input:

1
50 10
33 28 16 37 35 47 28 35 31 21
47 40 33 25 16 40 50 25 13 33
10 14 48 38 1 38 32 43 28 18
11 16 1 51 4 45 16 31 27 41
52 18 32 51 17 31 38 48 49 47
5 24 20 48 51 20 29 32 35 20
39 18 21 45 10 30 11 5 32 32
5 46 19 39 30 26 15 17 15 8
15 15 21 25 41 28 6 8 6 20
47 28 34 12 44 16 48 49 52 47
23...

output:

TAK
216337
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:

ok Correct! Used 216337 swaps

Test #5:

score: 0
Accepted
time: 2ms
memory: 3912kb

input:

5
10 1
11
2
10
3
1
12
8
4
5
7
10 7
11 5 6 5 2 1 2
8 7 1 9 10 6 4
6 8 4 6 2 12 9
12 3 10 5 11 4 7
9 11 4 2 9 3 9
6 7 5 11 1 10 6
11 7 6 7 12 1 1
5 3 2 3 4 7 12
3 8 11 9 12 9 8
1 12 12 4 10 1 2
10 7
9 8 12 8 10 7 4
1 1 10 7 3 5 1
11 6 11 5 2 4 12
6 12 8 3 8 6 8
12 7 4 1 11 8 6
7 6 2 5 9 3 6
12 10 4 9 ...

output:

TAK
0
TAK
5237
10 11
10 11
10 11
10 11
10 11
10 11
10 11
9 10
9 10
9 10
9 10
9 10
9 10
9 10
8 9
8 9
8 9
8 9
8 9
8 9
8 9
7 8
7 8
7 8
7 8
7 8
7 8
7 8
6 7
6 7
6 7
6 7
6 7
6 7
6 7
5 6
5 6
5 6
5 6
5 6
5 6
5 6
4 5
4 5
4 5
4 5
4 5
4 5
4 5
3 4
3 4
3 4
3 4
3 4
3 4
3 4
2 3
2 3
2 3
2 3
2 3
2 3
2 3
1 2
1 2
1 2
...

result:

ok Correct! Used 13989 swaps

Test #6:

score: 0
Accepted
time: 10ms
memory: 3828kb

input:

2
25 10
27 26 27 26 27 26 27 26 27 26
26 27 26 27 26 27 26 27 26 27
25 25 25 25 25 25 25 25 25 25
24 24 24 24 24 24 24 24 24 24
23 23 23 23 23 23 23 23 23 23
22 22 22 22 22 22 22 22 22 22
21 21 21 21 21 21 21 21 21 21
20 20 20 20 20 20 20 20 20 19
19 19 19 19 19 19 19 19 18 18
18 18 18 18 18 18 18 1...

output:

TAK
57348
25 26
25 26
25 26
25 26
25 26
25 26
25 26
25 26
25 26
25 26
24 25
24 25
24 25
24 25
24 25
24 25
24 25
24 25
24 25
24 25
23 24
23 24
23 24
23 24
23 24
23 24
23 24
23 24
23 24
23 24
22 23
22 23
22 23
22 23
22 23
22 23
22 23
22 23
22 23
22 23
21 22
21 22
21 22
21 22
21 22
21 22
21 22
21 22
21...

result:

ok Correct! Used 106000 swaps

Test #7:

score: 0
Accepted
time: 16ms
memory: 5236kb

input:

1
50 10
1 1 1 37 35 47 1 35 31 21
47 40 1 25 1 40 1 25 13 1
10 14 48 38 1 38 32 43 1 18
11 1 1 1 4 45 1 31 27 41
1 18 32 1 17 31 38 48 49 47
1 24 1 48 1 1 29 32 35 1
39 18 21 45 10 30 11 1 32 32
1 46 19 39 30 26 15 17 15 8
15 15 21 25 41 1 6 8 6 1
47 1 34 12 1 1 48 49 1 47
23 18 1 1 37 1 41 1 2 30
4...

output:

TAK
205912
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:

ok Correct! Used 205912 swaps

Test #8:

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

input:

1
50 10
15 52 42 32 47 29 31 51 12 48
43 19 14 2 28 39 51 10 43 36
33 6 29 11 4 18 12 41 15 34
24 2 48 30 25 23 34 17 9 28
24 8 17 4 21 14 42 19 48 30
23 16 30 9 33 25 33 36 21 12
36 18 46 35 31 13 44 34 15 50
34 11 33 38 9 23 9 42 4 3
37 12 2 41 7 34 23 16 10 27
24 8 38 16 24 11 47 29 3 50
34 52 47...

output:

NIE

result:

ok Correct! Used 0 swaps