QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#270673#2002. RaceLeticiaFCS0 0ms0kbC++201.9kb2023-12-01 11:11:552023-12-01 11:11:56

Judging History

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

  • [2023-12-01 11:11:56]
  • 评测
  • 测评结果:0
  • 用时:0ms
  • 内存:0kb
  • [2023-12-01 11:11:55]
  • 提交

answer

#include<bits/stdc++.h>

using namespace std;



using pii = pair<int, int>;
int n, k;
pii path[200005];
vector<pii> g[200005];
bool vis[200005];
int mini[200005];
int ans, inf;
int dfs(int u, int p){
    pii child = {0, u};
    int sub = 0;
    for(auto [l, v] : g[u]){
        if(vis[v] || v == p) continue;
        int cur = dfs(v, u);
        sub += cur;
        child = max<pii>(child, {cur, v});
    }
    path[u] = child;
    return sub;
}

vector<pii> cur;

void dist(int u, int p, int prof, int edges){
    if(prof > k || edges >= ans) return;
    int comp = k - prof;
    if(comp >= 0)
        ans = min(ans, edges + mini[comp]);
    cur.emplace_back(prof, edges);
    for(auto [l, v] : g[u]){
        if(vis[v] || v == p) continue;
        dist(v, u, prof + l, edges + 1);
    }
}

vector<pii> child;
void decomp(int u){
    int sub = dfs(u, u);
    int c = u;
    while(path[c].first > sub/2) c = path[c].second;
    vis[c] = true;

    child.clear();
    cur.reserve(sub);
    for(auto [l, v] : g[c]){
        cur.clear();
        dist(v, c, l, 1);
        child.insert(child.end(), cur.begin(), cur.end());
        for(auto [prof, edges] : cur)
            mini[prof] = min(mini[prof], edges);
    }
    for(auto [prof, edges] : child)
        mini[prof] = inf;

    for(auto [l, v] : g[c])
        if(!vis[v])
            decomp(v);
}

int best_path(int N,int K,int H[][2], int L[]){
    inf = ans = 2000005;
    n = N;
    k = K;
    for(int i = 0; i < inf; i++) mini[i] = inf;
    mini[0] = 0;
    for(int i = 0; i + 1 < n; i++){
        int u = H[i][0], v = H[i][1], c = L[i];
        g[u].emplace_back(c, v);
        g[v].emplace_back(c, u);
    }
    mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
    
    for(int u = 0; u<n; u++) shuffle(g[u].begin(), g[u].end(), rng);
    decomp(0);
    if(ans >= inf) ans = -1;
    return ans;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Runtime Error

Test #1:

score: 0
Runtime Error

input:

100 50
0 1 1
1 2 2
2 3 2
3 4 1
4 5 2
5 6 1
6 7 1
7 8 1
8 9 1
9 10 2
10 11 2
11 12 2
12 13 1
13 14 1
14 15 1
15 16 2
16 17 1
17 18 2
18 19 1
19 20 1
20 21 1
21 22 2
22 23 2
23 24 2
24 25 2
25 26 1
26 27 2
27 28 2
28 29 2
29 30 2
30 31 2
31 32 1
32 33 1
33 34 2
34 35 2
35 36 1
36 37 1
37 38 1
38 39 1
...

output:

Unauthorized output

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Runtime Error

Test #39:

score: 0
Runtime Error

input:

100000 100
1 0 1
2 1 10
3 1 1
4 3 5
5 3 6
6 5 6
7 3 10
8 5 9
9 8 7
10 9 9
11 6 7
12 6 3
13 10 10
14 9 1
15 14 7
16 15 5
17 10 1
18 14 9
19 12 8
20 18 10
21 10 9
22 12 7
23 14 9
24 15 5
25 15 2
26 20 4
27 19 10
28 17 8
29 16 8
30 24 10
31 17 2
32 28 7
33 27 8
34 21 4
35 28 7
36 22 4
37 18 6
38 27 6
3...

output:

Unauthorized output

Subtask #4:

score: 0
Skipped

Dependency #1:

0%