Cod sursa(job #3129497)

Utilizator PVDoriginalPopescu Vladut Daniel PVDoriginal Data 14 mai 2023 20:10:13
Problema Cerere Scor 65
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include<bits/stdc++.h>
using namespace std;

    #define ll long long

    ifstream fin("cerere.in");
    ofstream fout("cerere.out");

    int n;
    vector<int> p;
    vector<int> k;
    vector<int> ans;
    vector<int> kID;

    void ShowPQ(priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq){

        for(; !pq.empty(); pq.pop())
            cout << pq.top().first << " " << pq.top().second+1 << "\n";
        cout << "\n";
    }

    void GetAns(int s, priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> &pq, int t){

        //cout << s+1 << "\n";
        //ShowPQ(pq);

        if(k[s] == 0) ans[s] = 0;
        else if(ans[s] == -1) pq.push(make_pair(k[s]+t, make_pair(s, 1)));

        while(!pq.empty() && t == pq.top().first){

            //cout << pq.top().first << " " << pq.top().second << "\n";

            //cout << "emptying " << pq.top().second.first+1 << "\n";

            //if(ans[s] != -1) cout << ans[s] << " + " << t << " - " << pq.top().second.second << "\n";

            if(ans[s] != -1)
                ans[pq.top().second.first] = ans[s] + pq.top().second.second;
            else
                pq.push(make_pair(k[s]+t, make_pair(pq.top().second.first, pq.top().second.second+1)));

            pq.pop();
        }

        if(!pq.empty())
            GetAns(p[s], pq, t+1);
    }

    int main(){

        //ios_base::sync_with_stdio(false);
        //cin.tie(NULL);

        fin >> n;
        p.resize(n); k.resize(n); ans.resize(n, -1);

        for(int i = 0; i < n; ++i)
            fin >> k[i];

        for(int i = 0, a, b; i < n-1; ++i)
            fin >> a >> b, p[b-1] = a-1;

        priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> pq;

        for(int i = 0; i < n; ++i){
            if(ans[i] == -1) GetAns(i, pq, 0);
            fout << ans[i] << " ";
        }

    }