답안 #1049253

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1049253 2024-08-08T15:28:32 Z beaconmc 경주 (Race) (IOI11_race) C++14
31 / 100
1388 ms 200652 KB
#include "race.h"
#include <bits/stdc++.h>
 
typedef long long ll;
#define FOR(i,x,y) for(ll i=x; i<y; i++)
#define FORNEG(i,x,y) for(ll i=x; i>y; i--)

using namespace std;

const ll maxn = 200005;
const ll INF = 1000000000;

vector<vector<ll>> edges[maxn];
ll par[maxn];
ll centpar[maxn];
ll depth[maxn];
ll realdepth[maxn];
ll ancc[maxn][20];
bool visited[maxn];
ll sub[maxn];
ll sus[maxn];

ll anc(ll a, ll x){
    if (a==0) return 0;
    if (x==0) return par[a];
    if (ancc[a][x] != -1) return ancc[a][x];
    return ancc[a][x] = anc(anc(a,x-1),x-1);
}

ll lca(ll a, ll b){
    if (depth[a] < depth[b]) swap(a,b);
    FORNEG(i,19,-1) if (depth[anc(a, i)] >= depth[b]) a = anc(a,i);
    if (a==b) return a;
    FORNEG(i,19,-1) if (anc(a,i) != anc(b,i)) a = anc(a,i), b = anc(b,i);
    return par[a];
}

void initdfs(ll a,ll p, ll d, ll dd){
    par[a] = p;
    depth[a] = d;
    realdepth[a] = dd;
    for (auto&i : edges[a]){
        if (i[0] != p) initdfs(i[0], a, d+1, dd+i[1]);
    }
}

ll centroid(ll root, ll a, ll p){
    for (auto&i : edges[a]){
        if (!visited[i[0]] && i[0] != p && sub[i[0]] > sub[root]/2) return centroid(root, i[0], a);
    }
    return a;
}
void dfs(ll a, ll p){
    sub[a] = 1;
    for (auto&i : edges[a]){

        if(i[0] != p && !visited[i[0]]) dfs(i[0], a), sub[a] += sub[i[0]];
    }
}
void build(ll a, ll p){

    dfs(a,p);
    ll cent = centroid(a, a, p);


    centpar[cent] = p;
    visited[cent] = 1;
    for (auto&i : edges[cent]){
        if (!visited[i[0]]) build(i[0], cent);
    }
}

vector<array<ll,3>> dists[maxn];

int best_path(int N, int K, int H[][2], int L[])
{
    FOR(i,0,maxn) par[i] = -1, centpar[i] = -1, par[i] -1, depth[i] = -1, realdepth[i] = -1,visited[i] = 0,dists[i].clear(),edges[i].clear(), sus[i] = INF;
    FOR(i,0,maxn)FOR(j,0,20) ancc[i][j] = -1;
    
    
    FOR(i,0,N-1){

        edges[H[i][0]].push_back({H[i][1], L[i]});
        edges[H[i][1]].push_back({H[i][0], L[i]});
    }

    
    initdfs(0,-1,0,0);
    dfs(0,-1);

    build(0,-1);



    

    FOR(i,0,N){
        ll temp = centpar[i];
        ll prev = i;
        ll cnt = 0;
        while (temp != -1){
            cnt++;

            ll idk = lca(temp,i);
            ll cur = depth[temp] + depth[i] - depth[idk]*2;
 
           
            ll dist = realdepth[temp] + realdepth[i] - realdepth[idk]*2;

            dists[temp].push_back({prev, dist, cur });
            
            prev = temp;
            temp = centpar[temp];
        }
    }
    ll ans = INF;
    FOR(i,0,N){
        sort(dists[i].begin(), dists[i].end());
        vector<ll> used;
        used.push_back(0);
        
        sus[0] = 0;
        vector<array<ll, 3>> cache;
        if (dists[i].size()) cache.push_back(dists[i][0]), used.push_back(dists[i][0][1]);;
        FOR(j,1,dists[i].size()){
            used.push_back(dists[i][j][1]);
            if (dists[i][j][0] != dists[i][j-1][0]){
                for (auto&k : cache){
                    if (k[1] <= K) sus[k[1]] = min(sus[k[1]], k[2]);

                }
            }
            ll req = K - dists[i][j][1];
            if (0<=req && req <= K) ans = min(ans, sus[req] + dists[i][j][2]);
            cache.push_back(dists[i][j]);
        }
        for (auto&k : used) if (0<=k && k<=K) sus[k] = INF;

    }

    if (ans >= INF) return -1;
    else return ans;

}












Compilation message

race.cpp: In function 'int best_path(int, int, int (*)[2], int*)':
race.cpp:77:56: warning: right operand of comma operator has no effect [-Wunused-value]
   77 |     FOR(i,0,maxn) par[i] = -1, centpar[i] = -1, par[i] -1, depth[i] = -1, realdepth[i] = -1,visited[i] = 0,dists[i].clear(),edges[i].clear(), sus[i] = INF;
      |                                                 ~~~~~~~^~
race.cpp:5:33: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::array<long long int, 3> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    5 | #define FOR(i,x,y) for(ll i=x; i<y; i++)
......
  125 |         FOR(j,1,dists[i].size()){
      |             ~~~~~~~~~~~~~~~~~~~  
race.cpp:125:9: note: in expansion of macro 'FOR'
  125 |         FOR(j,1,dists[i].size()){
      |         ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 54364 KB Output is correct
2 Correct 6 ms 54364 KB Output is correct
3 Correct 7 ms 54376 KB Output is correct
4 Correct 6 ms 54376 KB Output is correct
5 Correct 7 ms 54364 KB Output is correct
6 Correct 6 ms 54364 KB Output is correct
7 Correct 6 ms 54364 KB Output is correct
8 Correct 6 ms 54200 KB Output is correct
9 Correct 6 ms 54364 KB Output is correct
10 Correct 6 ms 54364 KB Output is correct
11 Correct 6 ms 54364 KB Output is correct
12 Correct 6 ms 54324 KB Output is correct
13 Correct 7 ms 54364 KB Output is correct
14 Correct 6 ms 54364 KB Output is correct
15 Correct 6 ms 54364 KB Output is correct
16 Correct 6 ms 54376 KB Output is correct
17 Correct 7 ms 54364 KB Output is correct
18 Correct 6 ms 54364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 54364 KB Output is correct
2 Correct 6 ms 54364 KB Output is correct
3 Correct 7 ms 54376 KB Output is correct
4 Correct 6 ms 54376 KB Output is correct
5 Correct 7 ms 54364 KB Output is correct
6 Correct 6 ms 54364 KB Output is correct
7 Correct 6 ms 54364 KB Output is correct
8 Correct 6 ms 54200 KB Output is correct
9 Correct 6 ms 54364 KB Output is correct
10 Correct 6 ms 54364 KB Output is correct
11 Correct 6 ms 54364 KB Output is correct
12 Correct 6 ms 54324 KB Output is correct
13 Correct 7 ms 54364 KB Output is correct
14 Correct 6 ms 54364 KB Output is correct
15 Correct 6 ms 54364 KB Output is correct
16 Correct 6 ms 54376 KB Output is correct
17 Correct 7 ms 54364 KB Output is correct
18 Correct 6 ms 54364 KB Output is correct
19 Correct 7 ms 54376 KB Output is correct
20 Correct 6 ms 54364 KB Output is correct
21 Correct 8 ms 54620 KB Output is correct
22 Incorrect 8 ms 54580 KB Output isn't correct
23 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 54364 KB Output is correct
2 Correct 6 ms 54364 KB Output is correct
3 Correct 7 ms 54376 KB Output is correct
4 Correct 6 ms 54376 KB Output is correct
5 Correct 7 ms 54364 KB Output is correct
6 Correct 6 ms 54364 KB Output is correct
7 Correct 6 ms 54364 KB Output is correct
8 Correct 6 ms 54200 KB Output is correct
9 Correct 6 ms 54364 KB Output is correct
10 Correct 6 ms 54364 KB Output is correct
11 Correct 6 ms 54364 KB Output is correct
12 Correct 6 ms 54324 KB Output is correct
13 Correct 7 ms 54364 KB Output is correct
14 Correct 6 ms 54364 KB Output is correct
15 Correct 6 ms 54364 KB Output is correct
16 Correct 6 ms 54376 KB Output is correct
17 Correct 7 ms 54364 KB Output is correct
18 Correct 6 ms 54364 KB Output is correct
19 Correct 288 ms 104184 KB Output is correct
20 Correct 286 ms 103092 KB Output is correct
21 Correct 276 ms 102504 KB Output is correct
22 Correct 238 ms 98808 KB Output is correct
23 Correct 284 ms 111288 KB Output is correct
24 Correct 154 ms 91948 KB Output is correct
25 Correct 541 ms 121312 KB Output is correct
26 Correct 322 ms 123688 KB Output is correct
27 Correct 322 ms 129012 KB Output is correct
28 Correct 1367 ms 200652 KB Output is correct
29 Correct 1388 ms 197968 KB Output is correct
30 Correct 331 ms 128756 KB Output is correct
31 Correct 323 ms 129780 KB Output is correct
32 Correct 523 ms 129012 KB Output is correct
33 Correct 1008 ms 171512 KB Output is correct
34 Correct 966 ms 171096 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 54364 KB Output is correct
2 Correct 6 ms 54364 KB Output is correct
3 Correct 7 ms 54376 KB Output is correct
4 Correct 6 ms 54376 KB Output is correct
5 Correct 7 ms 54364 KB Output is correct
6 Correct 6 ms 54364 KB Output is correct
7 Correct 6 ms 54364 KB Output is correct
8 Correct 6 ms 54200 KB Output is correct
9 Correct 6 ms 54364 KB Output is correct
10 Correct 6 ms 54364 KB Output is correct
11 Correct 6 ms 54364 KB Output is correct
12 Correct 6 ms 54324 KB Output is correct
13 Correct 7 ms 54364 KB Output is correct
14 Correct 6 ms 54364 KB Output is correct
15 Correct 6 ms 54364 KB Output is correct
16 Correct 6 ms 54376 KB Output is correct
17 Correct 7 ms 54364 KB Output is correct
18 Correct 6 ms 54364 KB Output is correct
19 Correct 7 ms 54376 KB Output is correct
20 Correct 6 ms 54364 KB Output is correct
21 Correct 8 ms 54620 KB Output is correct
22 Incorrect 8 ms 54580 KB Output isn't correct
23 Halted 0 ms 0 KB -