11112022-03-03 22:30:16peti1234Fájlrendszercpp14Accepted 40/4045ms16944 KiB
#include <bits/stdc++.h>

using namespace std;
const int c=100005;
int n;
vector<int> sz[c];
long long db[c], valasz=1, mod=1e9+7;


pair<long long, long long> dfs(int a) {
    long long cnt=0, fh=0;
    // cnt=gyerekeiben hany fajl van eddig, fh=hany helyre lehet tenni a fajlokat
    for (auto x:sz[a]) {
        pair<long long, long long> p=dfs(x);
        cnt+=p.first, fh+=p.second;
        // konnyen kiszamithato rekurzivan
    }
    if (sz[a].size()==0) {
        fh++;
        // nincs gyereke, tehat lehet fajlt tenni ide
    }
    if (db[a]!=-1) {
        // pontoasn ki lehet szamitani a maradek fajlok es a helyek fuggvenyeben (fh<=2)
        // altalanos keplet is van, a furcsa felteteleknek koszonhetoen nem kell inverzet es (a alatt b-t) szamolni
        long long s=db[a]-cnt;
        if (s<0 || s>0 && fh==0) valasz=0;
        else {
            if (fh==2) {
                valasz=valasz*(s+1)%mod;
            }
        }
        return {db[a], 0};
    } else {
        // ha nem tudjuk, hogy itt hany fajl van, akkor simat tovabb kell adni az erteket
        return {cnt, fh};
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin >> n;
    for (int i=1; i<=n; i++) {
        int x;
        cin >> x >> db[i];
        // iranyitott fagraf
        if (i>1) {
            sz[x].push_back(i);
        }
    }
    dfs(1);
    cout << valasz << "\n";
    return 0;
}
SubtaskSumTestVerdictTimeMemory
base40/40
1Accepted0/04ms6568 KiB
2Accepted0/024ms10140 KiB
3Accepted1/13ms7192 KiB
4Accepted1/13ms7192 KiB
5Accepted1/13ms7192 KiB
6Accepted1/13ms7200 KiB
7Accepted2/23ms7208 KiB
8Accepted2/24ms7428 KiB
9Accepted3/34ms7488 KiB
10Accepted3/34ms7684 KiB
11Accepted3/36ms7792 KiB
12Accepted3/37ms8076 KiB
13Accepted4/414ms9520 KiB
14Accepted4/417ms10656 KiB
15Accepted4/423ms11784 KiB
16Accepted4/443ms15836 KiB
17Accepted4/445ms16944 KiB