Submission #1346620

#TimeUsernameProblemLanguageResultExecution timeMemory
1346620SzymonKrzywdaFile Paths (BOI15_fil)C++20
100 / 100
394 ms40124 KiB
#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;
using vi = vector<int>;
using pii = pair<int, int>;

#define ff first
#define ss second

int n, m, k, len;

const int MAXN = 6000 + 7;
vector<pii> graf[MAXN];
bool ans[MAXN];
pii parent[MAXN];
unordered_map<int, int> sciezki;
unordered_set<int> sciezki2;

void dfs2(int v, int aktlen) {
    if (v <= n) sciezki2.insert(aktlen);
    for (auto & [s, w] : graf[v]) {
        dfs2(s, aktlen + w);
    }
}

void dfs3(int v, int aktlen, int delta) {
    if (v <= n) {
        sciezki[aktlen] += delta;
        if (sciezki[aktlen] == 0) sciezki.erase(aktlen);
    }

    for (auto & [s, w] : graf[v]) {
        dfs3(s, aktlen + w, delta);
    }
}

void dfs(int v, int aktlen) {
    //cout << "OH: " << v << ' ' << aktlen << '\n';
    if (graf[v].size()) {
        dfs3(v, 0, 1);


        for (auto & [s, w] : graf[v]) {
            dfs(s, aktlen + w);
        }

        dfs3(v, 0, -1);

        return;

    }

    if (len == aktlen) {
        ans[v] = 1;
    }
    else {
        for (int d = 1; d * d <= len - aktlen; d++) {
           // cout << "OHH: " << v << ' ' << len - aktlen << ' ' << d << '\n';
            if ((len - aktlen) % d == 0) {
                if (sciezki.find(d - k) != sciezki.end()) {
                    ans[v] = 1;
                    return;
                }
                if (sciezki.find((len - aktlen) / d - k) != sciezki.end()) {
                    ans[v] = 1;
                    return;
                }
            }
        
        }
        if (sciezki.find(len - aktlen - k) != sciezki.end()) {
            ans[v] = 1;
            return;
        }
    }


    int v2 = v;
    int aktlen2 = 0;
    while (v2) {
        aktlen2 += parent[v2].ss;
        v2 = parent[v2].ff;
        if (sciezki2.find(len - aktlen2 - k) != sciezki2.end()) ans[v] = 1;
    }





}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m >> len;
    cin >> k;
    k++;

    for (int i = 1; i <= n; i++) {
        int p, val;
        cin >> p >> val;
        graf[p].push_back({i, val + 1});
        parent[i] = {p, val + 1};
    }   
    for (int i = n + 1; i <= n + m; i++) {
        int p, val;
        cin >> p >> val;
        graf[p].push_back({i, val + 1});
        parent[i] = {p, val + 1};
    }
    dfs2(0, 0);
    sciezki[0] = 1;
    dfs(0, 0);

    for (int i = n + 1; i <= n + m; i++) {
        if (ans[i]) cout << "YES\n";
        else cout << "NO\n";
    }



    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...