QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#683372 | #6432. Puzzle in Inazuma | Andycraft | WA | 1ms | 3936kb | C++20 | 4.1kb | 2024-10-27 20:34:57 | 2024-10-27 20:34:58 |
Judging History
answer
#include <cassert>
#include <iostream>
#include <algorithm>
#include <vector>
template <class T> using Arr = std::vector<T>;
typedef long long LL;
#if 1
#ifdef assert
#undef assert
#endif
#define assert(x) ({ if (!(x)) { printf("%s\n", #x); exit(0); } })
#endif
const int MAXN = 105;
int g[MAXN][MAXN], h[MAXN][MAXN];
int n;
void dfs(int now, int dep, const int &m, Arr<Arr<int>> &v) {
static Arr<int> buf;
if (dep == 4) {
v.push_back(buf);
return;
}
for (int i = now; i <= m; ++i) {
buf.push_back(i);
dfs(i + 1, dep + 1, m, v);
buf.pop_back();
}
}
int main() {
std::ios::sync_with_stdio(false);
std::cin >> n;
LL sum = 0;
for (int i = 1; i < n; ++i)
for (int j = i + 1; j <= n; ++j) {
std::cin >> g[i][j];
g[j][i] = g[i][j];
sum += g[i][j];
}
for (int i = 1; i < n; ++i)
for (int j = i + 1; j <= n; ++j) {
std::cin >> h[i][j];
h[j][i] = h[i][j];
sum -= h[i][j];
}
if (sum != 0)
return puts("-1"), 0;
Arr<Arr<int>> ans;
auto act = [&](int a, int b, int c, int d, int x) {
assert(a != b && a != c && a != d && b != c && b != d && c != d);
ans.push_back({a, b, c, d, x});
g[a][b] += x;
g[a][c] += x;
g[a][d] += x;
g[b][c] -= x;
g[c][d] -= x;
g[b][d] -= x;
g[b][a] += x;
g[c][a] += x;
g[d][a] += x;
g[c][b] -= x;
g[d][c] -= x;
g[d][b] -= x;
};
auto mex = [&](Arr<int> v) { std::ranges::sort(v); v.erase(std::unique(v.begin(), v.end()), v.end()); for (int i = 0; i < (int)v.size(); ++i) if (v[i] != i) return i; return (int)v.size(); };
auto cross_legacy = [&](int a, int b, int c, int d, int x) {
assert(~x & 1);
act(a, b, c, d, x / 2);
act(b, a, c, d, x / 2);
};
auto cross = [&](int a, int b, int c, int d, int x) {
assert(~x & 1);
int u = mex({a - 1, b - 1, c - 1, d - 1}) + 1;
int v = mex({a - 1, b - 1, c - 1, d - 1, u - 1}) + 1;
cross_legacy(a, b, u, v, x);
cross_legacy(u, v, c, d, x);
};
for (int i = n; i > 6; --i) {
Arr<int> tp;
for (int j = 1; j < i; ++j)
if ((g[j][i] ^ h[j][i]) & 1)
tp.push_back(j);
int m = (int)tp.size();
int j;
for (j = 0; j + 3 <= m; j += 3)
act(i, tp[j], tp[j + 1], tp[j + 2], 1);
j -= 3;
if (m == j + 1) {
int u = mex({tp[j] - 1}) + 1;
int v = mex({tp[j] - 1, u - 1}) + 1;
int w = mex({tp[j] - 1, u - 1, v - 1}) + 1;
act(i, tp[j], u, v, 1);
act(i, tp[j], u, w, 1);
act(i, tp[j], v, w, 1);
} else if (m == j + 2) {
int u = mex({tp[j] - 1, tp[j + 1] - 1}) + 1;
int v = mex({tp[j] - 1, tp[j + 1] - 1, u - 1}) + 1;
act(i, tp[j], u, v, 1);
act(i, tp[j + 1], u, v, 1);
} else
assert(m == j);
}
int m = std::min(n, 6);
Arr<Arr<int>> ch;
dfs(1, 0, m, ch);
int K = (int)ch.size();
bool success = false;
for (int S = 0; S < (1 << K); ++S) {
for (int i = 0; i < K; ++i)
if (S & (1 << i))
for (int u = 0; u < 4; ++u)
for (int v = u + 1; v < 4; ++v)
g[ch[i][u]][ch[i][v]] ^= 1;
bool fail = false;
for (int i = 1; i < m; ++i)
for (int j = i + 1; j <= m; ++j)
if ((g[i][j] ^ h[i][j]) & 1) {
fail = true;
break;
}
for (int i = 0; i < K; ++i)
if (S & (1 << i))
for (int u = 0; u < 4; ++u)
for (int v = u + 1; v < 4; ++v)
g[ch[i][u]][ch[i][v]] ^= 1;
if (!fail) {
success = true;
for (int i = 0; i < K; ++i)
if (S & (1 << i))
act(ch[i][0], ch[i][1], ch[i][2], ch[i][3], 1);
break;
}
}
if (!success)
return puts("-1"), 0;
for (int i = 1; i < n; ++i)
for (int j = i + 1; j <= n; ++j)
assert(~(g[i][j] ^ h[i][j]) & 1);
if (n >= 6) {
for (int i = n; i > 1; --i)
for (int j = i - 1; j >= 1; --j)
if (g[i][j] != h[i][j]) {
assert(i != 2 || j != 1);
int u = 1, v = 2;
cross(i, j, u, v, h[i][j] - g[i][j]);
}
} else
for (int i = n; i > 1; --i)
for (int j = i - 1; j >= 1; --j)
if (g[i][j] != h[i][j]) {
// assert(i != 2 || j != 1);
int u = mex({i - 1, j - 1}) + 1;
int v = mex({i - 1, j - 1, u - 1}) + 1;
cross_legacy(i, j, u, v, h[i][j] - g[i][j]);
}
// for (int i = 1; i < n; ++i)
// for (int j = i + 1; j <= n; ++j)
// assert(g[i][j] == h[i][j]);
printf("%lu\n", ans.size());
for (auto v : ans)
printf("%d %d %d %d %d\n", v[0], v[1], v[2], v[3], v[4]);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3772kb
input:
4 0 1 1 0 0 1 1 0 0 1 1 0
output:
5 1 2 3 4 1 4 2 1 3 1 2 4 1 3 1 4 1 2 3 -1 1 4 2 3 -1
result:
ok n=4
Test #2:
score: 0
Accepted
time: 0ms
memory: 3740kb
input:
4 3 3 3 0 0 0 0 0 0 3 3 3
output:
7 1 2 3 4 1 4 3 1 2 2 3 4 1 2 2 4 2 1 3 2 2 4 1 3 2 4 1 2 3 -2 1 4 2 3 -2
result:
ok n=4
Test #3:
score: 0
Accepted
time: 0ms
memory: 3796kb
input:
5 -12 15 -12 1 37 14 7 7 9 -11 12 5 1 13 -1 -4 -7 -5 -9 18
output:
-1
result:
ok n=5
Test #4:
score: 0
Accepted
time: 0ms
memory: 3636kb
input:
4 37 81 -38 -79 -8 -42 20 -55 80 -23 -43 37
output:
-1
result:
ok n=4
Test #5:
score: 0
Accepted
time: 0ms
memory: 3572kb
input:
5 -22 63 -23 7 -11 36 66 66 -77 36 -87 -17 95 -65 -93 53 63 -54 -56 -77
output:
-1
result:
ok n=5
Test #6:
score: 0
Accepted
time: 0ms
memory: 3580kb
input:
6 -59 77 100 -28 -80 -14 -19 34 0 -8 34 44 58 38 7 87 -53 -57 -79 86 -19 -97 -51 -29 42 -14 61 -6 25 -24
output:
-1
result:
ok n=6
Test #7:
score: 0
Accepted
time: 0ms
memory: 3572kb
input:
10 96 -62 71 43 -41 62 37 -17 -73 -51 55 89 63 -17 81 98 78 -96 -70 -16 78 -63 49 86 20 -76 -21 8 -32 16 -93 45 -65 99 65 9 81 47 -2 -50 94 2 29 -77 77 67 -91 -97 -13 -75 -8 -79 21 -86 -44 -55 -92 19 -62 47 25 -88 -89 -10 1 94 -61 78 -70 8 30 -54 -9 19 -60 35 -21 -79 40 92 -56 -12 -56 2 -38 23 -31 2...
output:
-1
result:
ok n=10
Test #8:
score: 0
Accepted
time: 0ms
memory: 3592kb
input:
30 79 75 -71 -8 36 26 -38 -45 43 44 64 52 -23 -64 -73 97 -79 70 24 58 -9 11 14 58 -95 -88 -10 -80 -47 20 -55 86 89 -39 15 26 -32 38 -23 -30 -12 -4 81 39 -13 -43 -11 -38 -70 14 32 -67 -54 38 -80 -80 97 -49 -92 53 -94 -60 -77 -80 -11 75 51 43 52 -28 58 -26 71 -85 66 96 -61 52 -100 -49 93 92 -37 62 -55...
output:
-1
result:
ok n=30
Test #9:
score: 0
Accepted
time: 0ms
memory: 3560kb
input:
50 -47 49 10 46 -54 -70 -39 36 -1 100 -78 -27 23 43 15 -21 71 48 -82 95 85 -11 -99 35 -44 -31 70 -94 12 -45 -81 75 62 89 14 85 -82 -25 2 5 54 -25 -96 -30 -12 -70 13 -51 15 -48 -13 -53 49 19 -62 -15 -99 54 29 17 67 31 -58 80 -2 -97 -40 59 64 84 15 -32 76 -18 35 76 68 -69 47 51 -26 64 -70 71 14 -3 47 ...
output:
-1
result:
ok n=50
Test #10:
score: 0
Accepted
time: 1ms
memory: 3648kb
input:
100 -25 31 38 48 -19 32 87 -10 -30 -88 -79 98 -99 56 -52 -86 -89 51 77 -36 -52 72 -78 48 30 42 -45 84 -75 -71 -83 -48 92 -44 6 -83 -87 -82 -17 40 -44 82 64 -90 89 -34 88 10 -26 -84 -51 -29 86 -55 55 78 12 -38 -96 28 -78 52 -30 85 72 79 57 8 71 -68 -81 -21 14 44 -42 -26 42 95 20 -78 18 29 100 39 -19 ...
output:
-1
result:
ok n=100
Test #11:
score: 0
Accepted
time: 0ms
memory: 3636kb
input:
4 75 -69 93 78 24 -61 75 59 80 -50 31 -55
output:
-1
result:
ok n=4
Test #12:
score: 0
Accepted
time: 0ms
memory: 3796kb
input:
4 44 -25 -81 84 8 95 -70 -21 82 32 28 74
output:
-1
result:
ok n=4
Test #13:
score: 0
Accepted
time: 0ms
memory: 3868kb
input:
4 91 -18 -46 -80 -34 38 -25 18 -40 -35 86 -53
output:
-1
result:
ok n=4
Test #14:
score: 0
Accepted
time: 0ms
memory: 3808kb
input:
5 -16 92 -94 -83 -83 16 -74 75 3 -43 -28 45 -63 -100 -11 -39 -80 62 -14 21
output:
-1
result:
ok n=5
Test #15:
score: 0
Accepted
time: 0ms
memory: 3644kb
input:
5 -95 7 -3 76 57 -85 -98 -64 -28 70 5 48 -42 -99 -56 22 21 -51 74 -85
output:
-1
result:
ok n=5
Test #16:
score: 0
Accepted
time: 0ms
memory: 3832kb
input:
5 -10 31 33 -71 33 -49 4 72 -72 65 -74 55 20 41 61 62 -83 50 -1 -95
output:
-1
result:
ok n=5
Test #17:
score: 0
Accepted
time: 1ms
memory: 3868kb
input:
6 65 -33 2 -67 83 40 93 -28 86 54 -30 -11 56 40 -66 82 42 -32 -56 98 1 85 17 45 -12 -3 -50 -39 6 100
output:
61 1 2 3 5 1 1 2 3 6 1 1 2 4 5 1 1 3 4 5 1 2 3 4 5 1 6 5 3 4 83 5 6 3 4 83 3 4 1 2 83 4 3 1 2 83 6 4 3 5 -17 4 6 3 5 -17 3 5 1 2 -17 5 3 1 2 -17 6 3 4 5 -19 3 6 4 5 -19 4 5 1 2 -19 5 4 1 2 -19 6 2 3 4 -20 2 6 3 4 -20 3 4 1 2 -20 4 3 1 2 -20 6 1 3 4 7 1 6 3 4 7 3 4 1 2 7 4 3 1 2 7 5 4 3 6 -46 4 5 3 6...
result:
ok n=6
Test #18:
score: -100
Wrong Answer
time: 0ms
memory: 3936kb
input:
10 -68 -48 27 80 89 -22 -43 34 43 -41 -4 -10 -90 -62 -11 83 22 -64 -77 84 -20 -56 -56 -79 49 -54 90 19 75 6 41 6 -33 -29 -39 45 -27 7 6 -57 93 -53 -46 -85 -37 40 -49 -32 -28 -16 -71 -97 -99 -67 6 34 -65 -97 95 -99 72 -34 81 32 16 -49 -71 61 -83 89 -23 2 35 -20 50 -14 32 83 31 -43 -15 74 -87 22 -56 -...
output:
m == j
result:
wrong output format Expected integer, but "m" found