QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#123481 | #6107. One Path | verjun | WA | 9ms | 3584kb | C++14 | 4.2kb | 2023-07-12 17:31:21 | 2023-07-12 17:31:22 |
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, pair<int, int> > > q;
dfs2(1, 1, 0);
q.push(make_pair(mxval, make_pair(mxedg, Ans)));
for(int i = 1; i <= k; i++) {
pair<int, pair<int, int> > u = q.top(); q.pop();
Ans = Ans - u.second.second + u.first;
cout << Ans << " ";
int ww = u.second.first;
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, make_pair(mxedg, z1)));
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, make_pair(mxedg, z2)));
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3520kb
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: 3584kb
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: -100
Wrong Answer
time: 9ms
memory: 3516kb
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 1761607683 1761607683 1761607683 1849688069 1849688069 1849688069 1849688069 1871708167 1871708167 1871708167 1871708167 1877213193 1877213193 1877213193 1877213193 1878589451 1878589451 1878589451 1878589451 1878933517 1878933517 1878933517 1878933517 1879019535 1879019535 187...
result:
wrong answer 3rd numbers differ - expected: '1849688069', found: '1761607683'