Submission #1228478

#TimeUsernameProblemLanguageResultExecution timeMemory
1228478denislavSynchronization (JOI13_synchronization)C++20
40 / 100
8087 ms22288 KiB
# include <iostream>
# include <vector>
using namespace std;

const int MAX=2e5+11;

int n,m,q;
vector<pair<int,int>> adj[MAX];
vector<pair<int,int>> alive[MAX];

int ans;
void dfs(int curr, int par, int tm)
{
    ans++;
    for(pair<int,int>& p: adj[curr])
    {
        int nxt=p.first,id=p.second;
        if(nxt==par) continue;

        int bst=m+1;
        for(pair<int,int> pa: alive[id])
        {
            if(pa.first<=tm) bst=min(pa.second,tm);
        }
        if(bst<=tm) dfs(nxt,curr,bst);
    }
}

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

    cin>>n>>m>>q;
    for(int i=1;i<n;i++)
    {
        int u,v;
        cin>>u>>v;
        adj[u].push_back({v,i});
        adj[v].push_back({u,i});
    }
    for(int i=1;i<=m;i++)
    {
        int x;
        cin>>x;
        if((int)alive[x].size()>0 and alive[x].back().second==-1) alive[x][alive[x].size()-1].second=i;
        else alive[x].push_back({i,-1});
    }
    for(int i=1;i<n;i++) if((int)alive[i].size()>0 and alive[i].back().second==-1) alive[i][alive[i].size()-1].second=m;

    while(q--)
    {
        int x;
        cin>>x;
        ans=0;
        dfs(x,-1,m);
        cout<<ans<<"\n";
    }

    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...