QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#455038 | #7769. Axium Crisis | zqs | 0 | 0ms | 1440kb | C++14 | 4.4kb | 2024-06-25 18:09:42 | 2024-06-25 18:09:43 |
answer
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cassert>
using std::min;
const int N = 18 * 18 * 8 + 5, INF = 100000000;
struct Edge {int to, id, nxt, w;} e[37];
int LCP(bool *a, bool *b, int la, int lb) {
for (int i = 1; i <= min(la, lb); ++ i) if (a[i] != b[i]) return i - 1;
return min(la, lb);
}
struct node {
bool str[19]; int len, S, u, v;
inline bool operator < (const node &rhs) const {
for (int i = 1; i <= min(len, rhs.len); ++ i)
if (str[i] < rhs.str[i]) return true;
else if (str[i] > rhs.str[i]) return false;
return len < rhs.len;
}
} a[N];
int head[19], sta[19], f[19][1 << 17 | 1], lst[19][1 << 17 | 1], top, tot, m, nows;
inline void ae(int u, int v, int w, int id) {
e[++ tot].to = v, e[tot].w = w, e[tot].id = id, e[tot].nxt = head[u], head[u] = tot;
}
int rtnow;
//
void dfs(int u, int fa) {
if (top) {
int pre = min(top, 2);
for (int S = 0; S < 1 << pre; ++ S) {
bool flg = true; ++ m;
for (int i = 1; i <= pre; ++ i) {
if (sta[i] != 2 && (S >> i - 1 & 1) != sta[i]) {flg = false; break;}
a[m].str[i] = S >> i - 1 & 1;
}
if (!flg) {-- m; continue;}
for (int i = pre + 1; i <= top; ++ i) a[m].str[i] = (sta[i] == 1);
a[m].len = top, a[m].S = nows, a[m].u = rtnow, a[m].v = u;
}
}
for (int i = head[u]; i; i = e[i].nxt) if (e[i].to != fa) {
int v = e[i].to; sta[++ top] = e[i].w, nows |= 1 << e[i].id;
dfs(v, u), -- top, nows ^= 1 << e[i].id;
}
}
int stk[50000005], pre[50000005], b[N], w[19], pthu[19], pthv[19], eg[19], cur;
bool find(int u, int tar, int fa) {
if (u == tar) return true;
bool flg = false;
for (int i = head[u]; i; i = e[i].nxt) if (e[i].to != fa) {
eg[++ cur] = e[i].id; bool tmp = find(e[i].to, tar, u);
if (tmp) {flg = true; break;}
else -- cur;
}
return flg;
}
int main() {
freopen("bridge.in", "r", stdin);
puts("1"); int _; scanf("%d%*d", &_);
while (_ --) {
memset(head, 0, sizeof head), tot = m = top = 0;
int n; scanf("%d", &n);
memset(w, 0, sizeof w);
for (int i = 0, u, v, W; i < n - 1; ++ i) {
scanf("%d%d%d", &u, &v, &W), ++ u, ++ v, ae(u, v, W, i), ae(v, u, W, i);
if (W == 1) w[i + 1] = 1;
}
for (int i = 1; i <= n; ++ i) rtnow = i, dfs(i, -1);
std::sort(a + 1, a + m + 1);
top = 0, b[0] = b[m] = 0;
for (int i = 1; i < m; ++ i)
b[i] = LCP(a[i].str, a[i + 1].str, a[i].len, a[i + 1].len);
for (int j = 0; j <= n; ++ j)
for (int S = 0; S < 1 << n - 1; ++ S) f[j][S] = -INF, lst[j][S] = 0;
f[0][0] = 0;
for (int i = 1; i <= m; ++ i) {
for (int j = 0; j <= b[i - 1]; ++ j) {
for (int S = 0; S < 1 << n - 1; ++ S) if (f[j][S] >= 0) {
int t = min(b[i], j);
if (!(S & a[i].S)) {
int S0 = S | a[i].S;
if (f[b[i]][S0] < f[j][S] + a[i].len - j) {
f[b[i]][S0] = f[j][S] + a[i].len - j;
lst[b[i]][S0] = ++ top, stk[top] = i;
pre[top] = lst[j][S];
}
}
if (j > b[i]) {
if (f[j][S] > f[b[i]][S]) f[b[i]][S] = f[j][S], lst[b[i]][S] = lst[j][S];
f[j][S] = -INF, lst[j][S] = 0;
}
}
}
}
int ans = 0, mxi = 0, mxj = 0;
for (int i = 0; i <= n; ++ i)
for (int S = 0; S < 1 << n - 1; ++ S)
if (f[i][S] > ans) ans = f[mxi = i][mxj = S];
int now = lst[mxi][mxj], len = 0;
while (now) {
int i = stk[now];
cur = 0, find(a[i].u, a[i].v, -1);
for (int j = 1; j <= cur; ++ j) w[eg[j] + 1] = a[i].str[j];
pthu[++ len] = a[i].u, pthv[len] = a[i].v;
now = pre[now];
}
printf("%d\n%d\n", ans + 1, len);
for (int i = 1; i < n; ++ i) printf("%d ", w[i]);
puts("");
for (int i = 1; i <= len; ++ i) printf("%d %d\n", pthu[i] - 1, pthv[i] - 1);
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 1304kb
input:
1000 0 4 0 2 0 2 3 0 2 1 0 4 3 2 1 0 2 1 1 2 2 4 0 2 2 0 1 0 3 0 0 4 1 2 1 3 2 0 2 0 1 4 0 2 0 0 3 0 2 1 0 4 0 2 1 0 3 1 0 1 1 4 3 1 0 2 1 2 3 0 2 4 3 1 1 3 0 1 2 3 0 4 1 0 0 2 0 2 2 3 2 4 1 2 0 3 0 0 2 3 2 3 2 1 0 0 2 1 4 3 0 1 1 2 1 2 3 0 4 2 1 0 3 0 1 1 0 1 4 3 2 1 3 1 1 0 1 1 4 1 2 1 1 3 0 3 0 1...
output:
1
result:
wrong output format Unexpected end of file - int32 expected
Subtask #2:
score: 0
Wrong Answer
Test #3:
score: 0
Wrong Answer
time: 0ms
memory: 1356kb
input:
3000 3 4 0 1 1 0 3 1 0 2 0 4 3 2 0 0 1 1 1 2 0 4 1 0 0 2 3 1 3 1 0 4 2 1 0 2 0 1 3 0 0 4 2 3 1 3 0 1 2 1 0 4 2 3 1 2 1 1 2 0 1 4 0 2 0 1 0 0 3 0 0 4 3 1 1 0 2 0 2 3 0 6 4 0 0 3 1 1 2 3 0 0 5 1 1 5 0 4 2 3 1 3 0 0 3 1 1 4 0 3 0 1 2 0 0 2 1 4 0 2 1 3 1 0 2 1 1 4 2 0 0 2 3 1 1 3 0 6 3 1 0 3 4 1 4 0 1 2...
output:
1
result:
wrong output format Unexpected end of file - int32 expected
Subtask #3:
score: 0
Skipped
Dependency #1:
0%
Subtask #4:
score: 0
Skipped
Dependency #2:
0%
Subtask #5:
score: 0
Skipped
Dependency #3:
0%
Subtask #6:
score: 0
Skipped
Dependency #4:
0%
Subtask #7:
score: 0
Wrong Answer
Test #13:
score: 0
Wrong Answer
time: 0ms
memory: 1440kb
input:
3000 1 11 2 5 0 10 2 0 6 2 0 2 8 0 0 2 0 2 1 0 2 4 0 2 9 0 2 3 0 7 2 0 11 7 8 0 6 4 0 1 6 0 2 8 0 8 0 0 6 3 0 9 5 0 5 8 0 1 2 0 9 10 0 8 1 4 0 2 3 0 6 5 0 6 7 0 2 4 0 7 3 0 1 0 0 8 4 0 0 0 5 0 7 2 0 0 2 0 0 6 0 0 1 0 0 3 0 11 5 1 0 7 2 0 9 2 0 4 9 0 0 2 0 8 5 0 0 6 0 3 6 0 4 10 0 1 7 0 7 6 2 0 0 5 0...
output:
1
result:
wrong output format Unexpected end of file - int32 expected
Subtask #8:
score: 0
Wrong Answer
Test #14:
score: 0
Wrong Answer
time: 0ms
memory: 1288kb
input:
3000 2 8 4 7 2 4 3 2 3 2 2 4 5 2 1 4 2 6 4 2 0 1 2 8 1 5 2 0 7 2 3 2 2 3 1 2 5 7 2 4 0 2 6 4 2 8 1 3 2 5 3 2 7 6 2 2 6 2 0 7 2 4 6 2 0 5 2 8 5 7 2 2 6 2 1 6 2 4 5 2 4 0 2 0 1 2 7 3 2 11 2 7 2 0 9 2 8 9 2 10 7 2 6 9 2 9 3 2 4 10 2 7 5 2 7 9 2 1 9 2 8 2 6 2 1 5 2 4 1 2 1 3 2 6 1 2 0 1 2 6 7 2 14 2 6 2...
output:
1
result:
wrong output format Unexpected end of file - int32 expected
Subtask #9:
score: 0
Skipped
Dependency #6:
0%
Subtask #10:
score: 0
Skipped
Dependency #5:
0%