Submission #1127

#TimeUsernameProblemLanguageResultExecution timeMemory
1127gs12117Synchronization (JOI13_synchronization)C++98
60 / 100
952 ms18580 KiB
#include<stdio.h> int edge[100100][2]; int root[100100]; int elist[200100]; int es[100100]; int echg[200100]; int query[100100]; int n,m,q; int chk[100100]; int echk[100100]; int vchk[100100]; int its[1<<19]; int ite[1<<19]; int ifs[1<<19]; int ife[1<<19]; int total[1<<19]; int calc(int loc,int *it){ loc+=7; int i; int ans=0; for(i=0;i<18;i++){ if(loc&(1<<i)){ ans+=it[loc]; loc-=1<<i; } } return ans; } void push(int loc,int k,int *it){ loc+=7; int i; for(i=0;i<18;i++){ if(loc&(1<<i)){ it[loc]+=k; loc+=1<<i; } } } void ins(int start,int end,int k,int *it){ push(start,k,it); push(end+1,-k,it); } int ssc(int val,int *it){ int i; int loc=-1; for(i=17;i>=0;i--){ loc+=(1<<i); if(calc(loc,it)>=val)loc-=(1<<i); } loc++; return loc; } int msc(int val,int *it){ int i; int loc=-1; for(i=17;i>=0;i--){ loc+=(1<<i); if(calc(loc,it)>val)loc-=(1<<i); } return loc; } void dfs(int loc){ chk[loc]=1; int i; for(i=es[loc];i<es[loc+1];i++){ if(chk[elist[i]]==0){ root[elist[i]]=loc; dfs(elist[i]); } } } void vdfs(int loc){ vchk[loc]=1; int i; for(i=es[loc];i<es[loc+1];i++){ if(vchk[elist[i]]==0&&echk[elist[i]]==1){ vdfs(elist[i]); } } } int main(){ int i; scanf("%d%d%d",&n,&m,&q); for(i=0;i<n-1;i++){ scanf("%d%d",&edge[i][0],&edge[i][1]); } for(i=0;i<m;i++){ scanf("%d",&echg[i]); } for(i=0;i<q;i++){ scanf("%d",&query[i]); } if(q==1){ for(i=0;i<m;i++){ echg[i]--; } for(i=0;i<n-1;i++){ es[edge[i][0]+2]++; es[edge[i][1]+2]++; } for(i=0;i<n+3;i++){ es[i+1]+=es[i]; } for(i=0;i<n-1;i++){ elist[es[edge[i][0]+1]]=edge[i][1]; elist[es[edge[i][1]+1]]=edge[i][0]; es[edge[i][0]+1]++; es[edge[i][1]+1]++; } dfs(query[0]); for(i=0;i<m;i++){ if(edge[echg[i]][0]==root[edge[echg[i]][1]]){ echg[i]=edge[echg[i]][1]; } else{ echg[i]=edge[echg[i]][0]; } } for(i=0;i<m;i++){ echk[echg[i]]++; echk[echg[i]]%=2; } vdfs(query[0]); for(i=m-1;i>=0;i--){ echk[echg[i]]++; echk[echg[i]]%=2; if(echk[echg[i]]==1&&vchk[root[echg[i]]]==1&&vchk[echg[i]]==0){ vdfs(echg[i]); } } int ans=0; for(i=1;i<=n;i++){ if(vchk[i]==1){ ans++; } } printf("%d",ans); return 0; } else{ for(i=1;i<=n;i++){ push(i,1,its); push(i,1,ite); push(i,1,ifs); push(i,1,ife); } for(i=0;i<m;i++){ echk[echg[i]]++; echk[echg[i]]%=2; if(echk[echg[i]]==1){ ins(ssc(echg[i],ife),msc(echg[i],ife),calc(echg[i]+1,ite)-echg[i],ife); ins(ssc(echg[i]+1,ifs),msc(echg[i]+1,ifs),calc(echg[i],its)-(echg[i]+1),ifs); ins(calc(echg[i],its),echg[i],calc(echg[i]+1,ite)-echg[i],ite); ins(echg[i]+1,calc(echg[i]+1,ite),calc(echg[i],its)-(echg[i]+1),its); } else{ ins(calc(echg[i],its),echg[i],echg[i]-calc(echg[i],ite),ite); ins(echg[i]+1,calc(echg[i]+1,ite),echg[i]+1-calc(echg[i]+1,its),its); } } for(i=1;i<=n;i++){ ins(calc(i,ifs),calc(i,ife),1,total); } for(i=0;i<q;i++){ printf("%d\n",calc(query[i],total)); } 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...