QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#123523 | #6107. One Path | SpaceJellyfish | WA | 28ms | 4220kb | C++17 | 4.5kb | 2023-07-12 19:34:15 | 2023-07-12 19:34:17 |
Judging History
answer
#include <cstdio>
#include <cstring>
#include <array>
#include <iostream>
using namespace std;
const int N = 2001;
int n, k, u[N], v[N], w[N], head[N], nxt[N << 1], to[N << 1], val[N << 1], eid = 2;
bool del[N];
void addedge(int u, int v, int w) {
to[eid] = v;
val[eid] = w;
nxt[eid] = head[u];
head[u] = eid++;
}
struct info{
int u;
long long val;
info(){}
info(int u, long long val) : u(u), val(val){}
};
typedef array<info, 3> tupl;
int fa[N];
long long ansup[N], ansdn[N];
void getfa(int i){
// printf("fa[%d] = %d\n", i, to[fa[i]]);
for (int e = head[i]; e; e = nxt[e])
if(e != fa[i]) {
fa[to[e]] = e ^ 1;
getfa(to[e]);
}
}
tupl uptu[N], dntu[N], upson[N];
void merge(tupl &tu, info inf) {
if(inf.val >= tu[0].val) {
tu[2] = tu[1];
tu[1] = tu[0];
tu[0] = inf;
}
else if(inf.val >= tu[1].val) {
tu[2] = tu[1];
tu[1] = inf;
}
else if(inf.val >= tu[2].val)
tu[2] = inf;
}
void up(int i) {
ansup[i] = 0;
uptu[i] = tupl();
upson[i] = tupl();
for (int e = head[i]; e; e = nxt[e])
if(e != fa[i] && !del[e >> 1]) {
up(to[e]);
ansup[i] = max(ansup[i], ansup[to[e]]);
info inf = uptu[to[e]][0];
inf.u = to[e];
inf.val += val[e];
merge(uptu[i], inf);
merge(upson[i], info(to[e], ansup[to[e]]));
}
ansup[i] = max(ansup[i], uptu[i][0].val + uptu[i][1].val);
// printf("ansup[%d] = %d\n", i, ansup[i]);
}
void down(int i) {
ansdn[i] = 0;
dntu[i] = uptu[i];
if(fa[i] && !del[fa[i] >> 1]) {
int f = to[fa[i]];
info inf = dntu[f][0].u != i ? dntu[f][0] : dntu[f][1];
inf.val += val[fa[i]];
merge(dntu[i], inf);
ansdn[i] = max(ansdn[f], upson[f][0].u != i ? upson[f][0].val : upson[f][1].val);
if(dntu[f][0].u == i)
ansdn[i] = max(ansdn[i], dntu[f][1].val + dntu[f][2].val);
else if(dntu[f][1].u == i)
ansdn[i] = max(ansdn[i], dntu[f][0].val + dntu[f][2].val);
else
ansdn[i] = max(ansdn[i], dntu[f][0].val + dntu[f][1].val);
// ansdn[i] = max(ansdn[i], val[fa[i]] + (dntu[f][0].u != i ? dntu[f][0].val : dntu[f][1].val));
// printf("ansdn[%d] = %d + %d\n", i, val[fa[i]], dntu[f][0].u != i ? dntu[f][0].val : dntu[f][1].val);
}
for (int e = head[i]; e; e = nxt[e])
if(e != fa[i] && !del[e >> 1])
down(to[e]);
}
int findroot(int i){
while(fa[i] && !del[fa[i] >> 1])
i = to[fa[i]];
return i;
}
void solve(int i) {
up(i);
down(i);
}
long long ans[N];
void getans(int u) {
for (int e = head[u]; e; e = nxt[e])
if(e != fa[u] && !del[e >> 1]) {
ans[to[e]] = ans[u];
getans(to[e]);
}
}
int main(){
scanf("%d%d", &n, &k);
for (int i = 1; i < n; i++) {
scanf("%d%d%d", &u[i], &v[i], &w[i]);
addedge(u[i], v[i], w[i]);
addedge(v[i], u[i], w[i]);
}
getfa(1);
for (int i = 1; i < n; i++)
if(to[fa[v[i]]] == u[i])
swap(u[i], v[i]);
solve(1);
long long now = ansup[1];
printf("%lld ", now);
for (int i = 1; i <= k; i++) {
memset(ans + 1, -1, sizeof(long long) * n);
for (int j = 1; j <= n; j++) {
if(ans[j] == -1) {
// printf("init %d\n", j);
int u = findroot(j);
solve(u);
ans[u] = ansup[u];
getans(u);
// puts("init success");
}
}
int candi = 1;
long long candians = 0;
for (int j = 1; j < n; j++)
if(!del[j]) {
// printf("j %d ansup[%d] %lld ansdn[%d] %lld\n", j, u[j], ansup[u[j]], u[j], ansdn[u[j]]);
// printf("j %d u %d v %d\n", j, u[j], v[j]);
long long nowans = ansup[u[j]] + ansdn[u[j]] + w[j] - ans[u[j]];
if(nowans >= candians) {
candians = nowans;
candi = j;
}
}
if(n > 50 && k > 0)
printf("%d %d ", u[candi], v[candi]);
// printf("candi %d %d %d, candians %lld\n", candi, u[candi], v[candi], candians);
now += candians;
del[candi] = true;
printf("%lld ", now);
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3820kb
input:
5 1 1 3 2 4 5 4 3 4 3 2 3 7
output:
14 16
result:
ok 2 number(s): "14 16"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3636kb
input:
7 2 1 2 4 2 3 6 2 4 2 4 5 5 2 6 1 4 7 3
output:
13 20 21
result:
ok 3 number(s): "13 20 21"
Test #3:
score: 0
Accepted
time: 3ms
memory: 3592kb
input:
50 2000 3 34 1 37 39 58720256 17 24 14680064 28 39 1 25 38 1 21 29 1 3 30 1 26 36 1 5 48 14336 4 22 1 26 41 1 41 44 1 5 14 1 23 25 28672 40 41 224 27 39 1 4 20 7340032 7 47 939524096 11 46 114688 30 49 3584 34 44 1 7 35 1 10 29 1 27 33 29360128 16 36 56 8 28 1 13 38 57344 34 45 896 15 35 469762048 1...
output:
1409286145 1761607683 1849688069 1871708167 1877213193 1878589451 1878933517 1879019535 1879041041 1879046419 1879047765 1879048103 1879048160 1879048160 1879048160 1879048160 1879048160 1879048160 1879048160 1879048160 1879048160 1879048160 1879048160 1879048160 1879048160 1879048160 1879048160 187...
result:
ok 2001 numbers
Test #4:
score: 0
Accepted
time: 1ms
memory: 3660kb
input:
10 5 1 4 10 3 7 138 1 9 162 4 10 113 4 6 12 5 6 171 2 10 31 7 8 12 7 10 132
output:
566 769 781 781 781 781
result:
ok 6 numbers
Test #5:
score: 0
Accepted
time: 0ms
memory: 3856kb
input:
2 0 1 2 340241821
output:
340241821
result:
ok 1 number(s): "340241821"
Test #6:
score: 0
Accepted
time: 2ms
memory: 4220kb
input:
2000 0 450 1620 747893383 103 1602 466748018 746 1996 468886757 430 764 455748265 1201 1275 111041658 244 802 715844971 611 899 125646661 1105 1633 478144612 180 573 823370712 161 1018 67225549 1512 1915 538711443 829 1871 761057722 1297 1499 576790037 1492 1832 983172784 1486 1902 78076400 1206 121...
output:
83343544566
result:
ok 1 number(s): "83343544566"
Test #7:
score: 0
Accepted
time: 0ms
memory: 3584kb
input:
2 2000 1 2 128840350
output:
128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 128840350 ...
result:
ok 2001 numbers
Test #8:
score: -100
Wrong Answer
time: 28ms
memory: 3860kb
input:
1139 1252 115 643 947372561 358 529 121247876 22 177 680088711 70 692 912515870 602 1032 172209848 908 1064 871258945 1052 1085 268011860 88 405 978751838 65 913 486052321 75 496 113634888 654 841 834034656 209 409 142094069 674 700 147589677 828 885 666263686 486 685 480409259 111 839 151780996 634...
output:
59768151302 585 206 90240365913 994 71 109345390588 83 749 124644045513 969 237 137837866321 522 1039 149756278857 746 435 160389594579 431 559 169052188193 332 848 177682485014 358 529 186307692639 356 1 194915965611 1048 294 202174583609 983 489 208536512850 157 547 214809947180 858 967 2207005390...
result:
wrong answer 2nd numbers differ - expected: '90240365913', found: '585'