Submission #1172081

#TimeUsernameProblemLanguageResultExecution timeMemory
1172081LudisseyFile Paths (BOI15_fil)C++20
33 / 100
80 ms9288 KiB
#include <bits/stdc++.h>
#define int long long
#define sz(a) (int)a.size()
#define all(a) a.begin(),a.end()
#define rall(a) a.rbegin(),a.rend()
 
using namespace std;
vector<vector<int>> child;
vector<int> depth;
vector<int> a;
vector<int> f;
vector<int> parent;
vector<int> file;
vector<int> dv;
vector<vector<int>> divs;
vector<pair<int,int>> it;
int n,m,k,s;
int in=0;
int c=1;
void prep(int x, int d){
    d+=a[x];
    depth[x]=d;
    if(x>=n-m) { file.push_back(x); in++; }
    else it[x].first=in;
    for (auto u : child[x]) prep(u,d);
    if(x<n-m) it[x].second=in;
}

void findSUM(int x, int d){
    if(x>=n-m) return;
    if(d>k) return;
    dv[d]=c;
    for (auto u : child[x]) findSUM(u,d+a[u]);
}

void dfs(int x){
    if(x>=n-m) return;
    for (auto u : child[x]) dfs(u);
    c++;
    findSUM(x,s);
    for (int i = it[x].first; i <= it[x].second; i++)
    {
        if(f[file[i]]) continue;
        for (auto u : divs[file[i]]) {
            if(dv[u]==c) { f[file[i]]=true; break; }
        }
    }
}

signed main() {
    cin >> n >> m >> k >> s;
    n+=m+1;
    depth.resize(n);
    dv.resize(k+1,0);
    divs.resize(n);
    child.resize(n);
    f.resize(n);
    it.resize(n);
    f.resize(n);
    a.resize(n);
    parent.resize(n);
    s++;
    for (int i = 1; i < n; i++) {
        int p;
        cin >> p>> a[i]; a[i]++;
        child[p].push_back(i);
        parent[i]=p;
    }
    a[0]=0;
    parent[0]=-1;
    prep(0,0);
    for (int i = n-m; i < n; i++)
    {
        int x=k-depth[i];
        if(x<=0) continue;
        for (int j = 1; j <= sqrt(x); j++)
        {
            if(x%j==0){
                divs[i].push_back(j);
                if(x/j!=j) divs[i].push_back(x/j);
            }
        }
    }
    dfs(0);
    c++;
    for (int i = 0; i < n-m; i++)
    {
        if(depth[i]+s>k) continue;
        dv[depth[i]+s]=c;
    }
    for (int i = n-m; i < n; i++){
        int u=parent[i];
        if(depth[i]==k) f[i]=true;
        while(u>-1){
            int x=depth[i]-depth[u];
            int v=k-x;
            if(v>=0&&dv[v]==c) f[i]=true;
            u=parent[u];
        }
    }
    for (int i = n-m; i < n; i++)
    {
        if(f[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...