제출 #1221108

#제출 시각아이디문제언어결과실행 시간메모리
1221108KindaGoodGamesPetrol stations (CEOI24_stations)C++20
0 / 100
121 ms6504 KiB
#include<bits/stdc++.h>

using namespace std;
#define int long long
#define pii pair<int,int>
#define tiii tuple<int,int,int>

vector<vector<pii>> adj;
int n, k;
vector<int>ans;

void DFS(int s){ 
    int node = s;
    int par = -1;

    priority_queue<int, vector<int>, greater<int>> pq;
    map<int, int> m2;
    int cur = 0;
    int steps = 1;
    while(true){
        while(pq.size() && (cur-pq.top()) >= k ){
            if((cur-pq.top()) == k){
                ans[node] += (n-steps); 
                m2[cur] +=  (n-steps);
            }else if(adj[node].size() >= 2){
                ans[par] += (n-steps-1);  
                m2[cur] +=  (n-steps-1);
            }
            pq.pop();
        }
        while(true){
            if(m2.empty()) break;
            pii it = *m2.begin();
            if((cur-it.first) < k) break;
            int v = (*m2.begin()).first;
            m2.erase(v);
            if((cur-v) == k){
                ans[node] += (n-steps); 
                m2[steps+k] +=  (n-steps);
            }else if(adj[node].size() >= 2){
                ans[par] += (n-steps-1);  
                m2[steps+k-(cur-v)] +=  (n-steps-1);
            } 
        }

        steps++;
        pq.push(cur);
        if(adj[node][0].first != par){
            par = node;
            cur +=adj[node][0].second;
            node=adj[node][0].first;
        }else if(adj[node].size() >= 2){ 
            par = node;
            cur +=adj[node][1].second;
            node=adj[node][1].first;
        }else{
            break;
        }
    }
} 

int32_t main(){
    cin >> n >> k; 

    adj.resize(n); 
    ans.resize(n); 

    for(int i = 0; i < n-1; i++){
        int a,b,c;
        cin >> a >> b >> c;
        adj[a].push_back({b,c});
        adj[b].push_back({a,c});
    }
    
    for(int i = 0; i < n; i++){
        if(adj[i].size() == 1){
            DFS(i);
        }
    }

    for(int i = 0; i < n; i++){
        cout << ans[i] << endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...