제출 #1336585

#제출 시각아이디문제언어결과실행 시간메모리
1336585sh_qaxxorov_571Traffic (IOI10_traffic)C++20
100 / 100
562 ms156944 KiB
#include <vector>
#include <algorithm>

using namespace std;

const int MAXN = 1000005;
vector<int> adj[MAXN];
long long subtree_sum[MAXN];
int fans[MAXN];
long long total_fans = 0;
long long min_congestion = 3e18; // Juda katta son
int result_city = 0;

// Har bir shoxchani (subtree) umumiy muxlislar sonini hisoblash
void dfs_sum(int u, int p) {
    subtree_sum[u] = fans[u];
    for (int v : adj[u]) {
        if (v != p) {
            dfs_sum(v, u);
            subtree_sum[u] += subtree_sum[v];
        }
    }
}

// Har bir shaharni arena deb tekshirib ko'rish
void dfs_solve(int u, int p) {
    long long max_val = 0;
    
    // Pastki shoxchalardagi tirbandlik
    for (int v : adj[u]) {
        if (v != p) {
            max_val = max(max_val, subtree_sum[v]);
            dfs_solve(v, u);
        }
    }
    
    // Yuqori (ota) tomondan keladigan tirbandlik
    long long upper_part = total_fans - subtree_sum[u];
    max_val = max(max_val, upper_part);
    
    // Eng kichik maksimal tirbandlikni topish
    if (max_val < min_congestion) {
        min_congestion = max_val;
        result_city = u;
    }
}

int LocateCentre(int N, int P[], int S[], int D[]) {
    total_fans = 0;
    for (int i = 0; i < N; i++) {
        adj[i].clear();
        fans[i] = P[i];
        total_fans += P[i];
    }
    
    for (int i = 0; i < N - 1; i++) {
        adj[S[i]].push_back(D[i]);
        adj[D[i]].push_back(S[i]);
    }
    
    dfs_sum(0, -1);
    dfs_solve(0, -1);
    
    return result_city;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...