QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#344267 | #5508. Job for a Hobbit | ucup-team1198 | AC ✓ | 16ms | 5356kb | C++20 | 5.7kb | 2024-03-03 21:29:10 | 2024-03-03 21:29:11 |
Judging History
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