Submission #1114844

#TimeUsernameProblemLanguageResultExecution timeMemory
1114844NewtonabcSynchronization (JOI13_synchronization)C++14
100 / 100
430 ms25164 KiB
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int MIDX=1e5+5;
vector<int> adj[N];
pair<int,int> edge[N];
int dp[2][N],pa[18][N],in[N],out[N],cnt=1,fw[N];
bool op[N];
void upd(int idx,int val){while(idx<=MIDX){fw[idx]+=val; idx+=idx & -idx;}}
int read(int idx){int sum=0; while(idx>0){sum+=fw[idx]; idx-=idx & -idx;} return sum;}
void dfs(int u,int p){
    pa[0][u]=p;
    in[u]=cnt++;
    for(int i=0;i<adj[u].size();i++){
        int v=adj[u][i];
        if(v==p) continue;
        dfs(v,u);
    }
    out[u]=cnt;
}
int findr(int u){
    for(int i=17;i>=0;i--) if(read(in[pa[i][u]])==read(in[u])) u=pa[i][u];
    return u;
}
int main(){
    int n,m,q;
    cin>>n >>m >>q;
    for(int i=1;i<n;i++){
        int a,b;
        cin>>a >>b;
        adj[a].push_back(b);
        adj[b].push_back(a);
        edge[i].first=a,edge[i].second=b;
    }
    dfs(1,1);
    for(int i=1;i<=n;i++) dp[0][i]=1,upd(in[i],1),upd(out[i],-1);
    for(int i=1;i<=17;i++) for(int j=1;j<=n;j++) pa[i][j]=pa[i-1][pa[i-1][j]];
    for(int i=0;i<m;i++){
        int u,tmpc,tmpp;
        cin>>u;
        op[u]^=1;
        tmpc=edge[u].first,tmpp=edge[u].second;
        if(pa[0][edge[u].first]!=edge[u].second) swap(tmpc,tmpp);\
        if(op[u]){
            upd(in[tmpc],-1),upd(out[tmpc],1);
            tmpp=findr(tmpp);
            dp[0][tmpp]+=dp[0][tmpc]-dp[1][tmpc];
        }
        else{
            tmpp=findr(tmpc);
            upd(in[tmpc],1),upd(out[tmpc],-1);
            dp[0][tmpc]=dp[1][tmpc]=dp[0][tmpp];
        }
        /*for(int i=1;i<=n;i++) cout<<dp[0][i] <<" ";
        cout<<"\n";
        for(int i=1;i<=n;i++) cout<<dp[1][i] <<" ";
        cout<<"\n\n";*/
    }
    for(int i=0;i<q;i++){
        int inp;
        cin>>inp;
        cout<<dp[0][findr(inp)] <<"\n";
    }

}

Compilation message (stderr)

synchronization.cpp: In function 'void dfs(int, int)':
synchronization.cpp:14:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   14 |     for(int i=0;i<adj[u].size();i++){
      |                 ~^~~~~~~~~~~~~~
#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...