QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#123491 | #6107. One Path | verjun | WA | 9ms | 3664kb | C++14 | 4.1kb | 2023-07-12 17:37:58 | 2023-07-12 17:38:00 |
Judging History
answer
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int Read() {
int x = 0, f = 1; char ch = getchar();
while(!isdigit(ch) && ch != '-') ch = getchar();
if(ch == '-') f = -1, ch = getchar();
while(isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
return x * f;
}
int first[5005], nxt[5005], to[5005], vis[5005], w[5005], tot = 1, dd[5005];
void Add(int x, int y, int z) {
nxt[++tot] = first[x]; first[x] = tot; to[tot] = y, w[tot] = z, dd[tot] = x;
nxt[++tot] = first[y]; first[y] = tot; to[tot] = x, w[tot] = z, dd[tot] = y;
}
int n, k, mx[2005][4], mpos[2005][4], chans[2005][3], chmpos[2005][3], ans[2005], zj[2005];
void upd(int u, int val, int pos) {
// cout << u << " " << pos << endl;
if(mx[u][1] < val || mpos[u][1] == -1)
mx[u][3] = mx[u][2], mpos[u][3] = mpos[u][2],
mx[u][2] = mx[u][1], mpos[u][2] = mpos[u][1],
mx[u][1] = val, mpos[u][1] = pos;
else if(mx[u][2] < val || mpos[u][2] == -1)
mx[u][3] = mx[u][2], mpos[u][3] = mpos[u][2],
mx[u][2] = val, mpos[u][2] = pos;
else if(mx[u][3] < val || mpos[u][3] == -1)
mx[u][3] = val, mpos[u][3] = pos;
}
void updans(int u, int val, int pos) {
if(chans[u][1] < val || chmpos[u][1] == -1)
chans[u][2] = chans[u][1], chmpos[u][2] = chmpos[u][1],
chans[u][1] = val, chmpos[u][1] = pos;
else if(chans[u][2] < val || chmpos[u][2] == -1)
chans[u][2] = val, chmpos[u][2] = pos;
}
void dfs(int u, int fa) {
for(int e = first[u]; e; e = nxt[e]) {
int v = to[e];
if(v == fa || vis[e]) continue ;
dfs(v, u);
if(mpos[v][1] == -1) upd(u, w[e], v);
else upd(u, mx[v][1] + w[e], v);
updans(u, ans[v], v);
}
ans[u] = max(chans[u][1], mx[u][1] + mx[u][2]);
}
int mxedg = -1, mxval;
void dfs2(int u, int fa, int ww) {
if(u != fa) {
int s1 = ans[u];
int chansf = (chmpos[fa][1] == u) ? chans[fa][2] : chans[fa][1];
int num = 0, mxf = 0;
for(int i = 1; i <= 3; i++) {
if(mpos[fa][i] != u && num < 2)
++num, mxf += mx[fa][i];
}
int s2 = max(mxf, chansf);
if(s2 + s1 + w[ww] > mxval)
mxval = s2 + s1 + w[ww], mxedg = ww, zj[u] = s1, zj[fa] = s2;
int s3 = (mpos[fa][1] == u) ? mx[fa][2] + w[ww] : mx[fa][1] + w[ww];
upd(u, s3, fa); updans(u, s2, fa);
// cout << u << " " << s1 << " " << s2 << " " << s3 << " " << w[ww] << endl;
}
for(int e = first[u]; e; e = nxt[e]) {
int v = to[e];
if(vis[e] || v == fa) continue ;
dfs2(v, u, e);
}
}
signed main() {
n = Read(), k = Read();
for(int i = 1; i < n; i++) {
int x = Read(), y = Read(), z = Read();
Add(x, y, z);
}
memset(mpos, -1, sizeof(mpos));
memset(chmpos, -1, sizeof(chmpos));
dfs(1, 0);
int Ans = ans[1];
cout << Ans << " ";
priority_queue<pair<int, int> > q;
dfs2(1, 1, 0);
q.push(make_pair(mxval - Ans, mxedg));
for(int i = 1; i <= k; i++) {
pair<int, int> u = q.top(); q.pop();
Ans = Ans + u.first;
cout << Ans << " ";
int ww = u.second;
vis[ww] = vis[ww ^ 1] = 1;
int z1 = zj[dd[ww]], z2 = zj[dd[ww ^ 1]];
// cout << dd[ww] << " " << dd[ww ^ 1] << endl;
memset(mpos, -1, sizeof(mpos));
memset(chmpos, -1, sizeof(chmpos));
memset(mx, 0, sizeof(mx));
memset(chans, 0, sizeof(chans));
memset(ans, 0, sizeof(ans));
mxedg = -1, mxval = 0;
dfs(dd[ww], 0);
dfs2(dd[ww], dd[ww], 0);
if(mxedg != -1) q.push(make_pair(mxval - z1, mxedg));
ww ^= 1;
memset(mpos, -1, sizeof(mpos));
memset(chmpos, -1, sizeof(chmpos));
memset(mx, 0, sizeof(mx));
memset(chans, 0, sizeof(chans));
memset(ans, 0, sizeof(ans));
mxedg = -1, mxval = 0;
dfs(dd[ww], 0);
dfs2(dd[ww], dd[ww], 0);
if(mxedg != -1) q.push(make_pair(mxval - z2, mxedg));
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3516kb
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: 1ms
memory: 3616kb
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: 9ms
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: 0ms
memory: 3576kb
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: 1ms
memory: 3508kb
input:
2 0 1 2 340241821
output:
340241821
result:
ok 1 number(s): "340241821"
Test #6:
score: -100
Wrong Answer
time: 1ms
memory: 3664kb
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:
2142430936
result:
wrong answer 1st numbers differ - expected: '83343544566', found: '2142430936'