Submission #1178255

#TimeUsernameProblemLanguageResultExecution timeMemory
1178255AlgorithmWarriorSynchronization (JOI13_synchronization)C++20
30 / 100
91 ms15944 KiB
#include <bits/stdc++.h>

using namespace std;

int const MAX=100005;
struct edge{
    int nod,id;
};
vector<edge>tree[MAX];
int n,m,q;
vector<int>pos[MAX];
int dp[MAX];
int root;
int rasp;

void read(){
    cin>>n>>m>>q;
    int i;
    for(i=1;i<n;++i){
        int u,v;
        cin>>u>>v;
        tree[u].push_back({v,i});
        tree[v].push_back({u,i});
    }
    for(i=1;i<=m;++i){
        int muchie;
        cin>>muchie;
        pos[muchie].push_back(i);
    }
    cin>>root;
}

void dfs(int nod,int tata,int id_edge){
    if(nod==root)
        dp[nod]=m;
    else{
        int ind=upper_bound(pos[id_edge].begin(),pos[id_edge].end(),dp[tata])-pos[id_edge].begin();
        if(ind){
            if(ind%2==0)
                dp[nod]=pos[id_edge][ind-1]-1;
            else
                dp[nod]=dp[tata];
        }
    }
    if(dp[nod])
        ++rasp;
    for(auto [fiu,id] : tree[nod])
        if(fiu!=tata)
            dfs(fiu,nod,id);
}

int main()
{
    read();
    dfs(root,0,0);
    cout<<rasp;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...