Submission #1288660

#TimeUsernameProblemLanguageResultExecution timeMemory
1288660wowwowwowSynchronization (JOI13_synchronization)C++20
100 / 100
179 ms24112 KiB
#include <bits/stdc++.h>
#define ll long long
#define all(v) v.begin(),v.end()
#define MASK(i) (1LL << (i))
#define ii pair<int,int>
#define fi first
#define se second
#define endl '\n'
#define forr(i,l,r,add) for(int i = l;i <= r; i = i + add)
#define fodd(i,l,r,sub) for(int i = l;i >= r ; i = i - sub)
template <typename T1, typename T2> bool minimize(T1 &a, T2 b) {if (a > b) {a = b; return true;} return false;}
template <typename T1, typename T2> bool maximize(T1 &a, T2 b) {if (a < b) {a = b; return true;} return false;}

using namespace std;

mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());
#define rand rd

long long Rand(long long l , long long h){
    assert(l <= h);
    return l + 1ll * rd() % (h - l + 1) * (rd() % (h - l + 1)) % (h - l + 1);
}

//////////////////////////////////////////////////////////// end of template ////////////////////////////////////////////////////////////

const int N = 1e5 + 15;
int numNode,numState,numQuery,dep[N],st[N],en[N],tg=0,bit[N*2],up[N][20];
vector<int> adj[N];
ii edge[N];
void add(int x, int val)
{
    while (x<=2*numNode)
    {
        bit[x]+=val;
        x+=x&-x;
    }
}
int get(int x)
{
    int ans=0;
    while (x>=1)
    {
        ans+=bit[x];
        x-=x&-x;
    }
    return ans;
}
void dfs(int u, int pa)
{
    up[u][0]=pa;
    for (int j=1; j<20; ++j) if ((1<<j)<dep[u]) up[u][j]=up[up[u][j-1]][j-1];
    st[u]=++tg;
    for (int v : adj[u]) if (v!=pa)
    {
        dep[v]=dep[u]+1;
        dfs(v,u);
    }
    en[u]=++tg;
}
int findRoot(int u)
{
    for (int j=19; j>=0; --j) if ((1<<j)<dep[u])
    {
        int v=up[u][j];
        if (dep[u]-dep[v]==get(st[u])-get(st[v])) u=v;
    }
    return u;
}
int lst[N],uni[N];
void solve()
{
    cin>>numNode>>numState>>numQuery;
    for (int i=1; i<numNode; ++i)
    {
        int u,v; cin>>u>>v;
        edge[i]={u,v};
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    dep[1]=1;
    dfs(1,-1);
    for (int i=1; i<numNode; ++i)
    {
        if (dep[edge[i].fi]<dep[edge[i].se]) swap(edge[i].fi,edge[i].se);
    }
    for (int i=1; i<=numNode; ++i) uni[i]=1;
    for (int tri=1; tri<=numState; ++tri)
    {
        int x; cin>>x;
        if (lst[x]==-1)
        {
            int u=edge[x].fi,v=edge[x].se;
            uni[u]=uni[findRoot(v)];
            add(st[u],-1);
            add(en[u]+1,1);
            lst[x]=uni[u];
        }
        else
        {
            int u=edge[x].fi,v=edge[x].se;
            int &cur=uni[findRoot(v)];
            cur+=uni[u];
            cur-=lst[x];
            add(st[u],1);
            add(en[u]+1,-1);
            lst[x]=-1;
        }
    }
    while (numQuery--)
    {
        int x; cin>>x;
        cout<<uni[findRoot(x)]<<'\n';
    }
}

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

    solve();
    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...