Cod sursa(job #2674811)

Utilizator Leonard123Mirt Leonard Leonard123 Data 20 noiembrie 2020 13:06:53
Problema Cerere Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<bits/stdc++.h>
#define pb push_back
#define maxn 100005
using namespace std;

int maimute, stramos[maxn], nr_maimuta[maxn], lant_maimuta[maxn], lant_anterior[maxn], lungime = 1, nr_lanturi = 1, x, y;
vector <int> fii[maxn], lant_curent;
vector<vector <int> > lant;

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

void citeste() {
    fin >> maimute;
    for (int i = 1; i <= maimute; i++)
        fin >> stramos[i];
    for (int i = 1; i < maimute; i++) {
        fin >> x >> y;
        fii[x].pb(y);
    }
    lant.pb(lant_curent);
}

int gaseste_numar(int maimuta) {
    if (stramos[maimuta] == 0)
        return 0;
    stramos[maimuta]++;
    int raspuns = maimuta;
    while(stramos[maimuta] > 0) {
        if(raspuns == 0)
            return 1;
        if (stramos[maimuta] > nr_maimuta[raspuns]) {
            stramos[maimuta] -= nr_maimuta[raspuns];
            raspuns = lant_anterior[lant_maimuta[raspuns]];
        } else {
            raspuns = lant[lant_maimuta[raspuns] - 1][nr_maimuta[raspuns] - stramos[maimuta]];
            stramos[maimuta] = 0;
        }
    }
    return stramos[raspuns] + 1;
}

void construieste_lanturi(int maimuta) {
    lant[nr_lanturi - 1].pb(maimuta);
    lant_maimuta[maimuta] = nr_lanturi;
    nr_maimuta[maimuta] = lungime;
    stramos[maimuta] = gaseste_numar(maimuta);
    int nr = 0;

    for (auto fiu : fii[maimuta]) {
        lungime++;
        if(nr++) {
            lungime = 1;
            nr_lanturi++;
            lant_anterior[nr_lanturi] = maimuta;
            lant.pb(lant_curent);
        }
        construieste_lanturi(fiu);
    }
}

int main() {
    citeste();
    construieste_lanturi(1);
    for (int i = 1; i <= maimute; i++)
        fout << stramos[i] << " ";
}