QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#123481#6107. One PathverjunWA 9ms3584kbC++144.2kb2023-07-12 17:31:212023-07-12 17:31:22

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-07-12 17:31:22]
  • 评测
  • 测评结果:WA
  • 用时:9ms
  • 内存:3584kb
  • [2023-07-12 17:31:21]
  • 提交

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'