Submission #467447

#TimeUsernameProblemLanguageResultExecution timeMemory
467447trxke01Traffic (IOI10_traffic)C++17
100 / 100
1323 ms166816 KiB
//HEADER
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;
typedef long long ll;
typedef pair<int, int> pii;

vector<vector<int>> adj(1e6+5);
// congestion passing through each city
vector<int> cong(1e6+5);
int minCongestion;
int bestCity;

int dfs1(int curr, int prev, const int P[]){
    int congestion = P[curr];
    for(int next : adj[curr]){
        if(next != prev){
            congestion += dfs1(next, curr, P);
        }
    }
    cong[curr] = congestion;
    return congestion;
}

void dfs2(int curr, int prev, const int P[]){
    // test
    int mostCong = 0;
    for(int next : adj[curr]){
        mostCong = max(mostCong, cong[next]);
    }
    // cout << "most for " << curr << " is " << mostCong << "\n";
    if(mostCong < minCongestion){
        minCongestion = mostCong;
        bestCity = curr;
    }
    for(int next : adj[curr]){
        if(next != prev){
            // reroot
            cong[curr] -= cong[next];
            cong[next] += cong[curr];

            // go
            dfs2(next, curr, P);
            // roll back
            cong[next] -= cong[curr];
            cong[curr] += cong[next];
        }
    }
}

int LocateCentre(int N, int P[], int S[], int D[]){
    for(int i = 0; i < N-1; i++){
        int u = S[i];
        int v = D[i];
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    // start at 0
    bestCity = 0;
    minCongestion = 2e9+1e8;

    // initialize cong with dfs1
    dfs1(0, -1, P);

    // // test
    // for(int i = 0; i < N; i++){
    //     cout << i << " : " << cong[i] << "\n";
    // }

    // reroot with dfs2
    dfs2(0, -1, P);

    // return
    return bestCity;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...