Submission #1226960

#TimeUsernameProblemLanguageResultExecution timeMemory
1226960WarinchaiSpring cleaning (CEOI20_cleaning)C++20
100 / 100
123 ms18244 KiB
#include<bits/stdc++.h> using namespace std; vector<int>adj[100005]; int sz[100005],hv[100005],hd[100005],pa[100005],in[100005],out[100005]; int cur=0; int val[100005]; int n,q; int cnt=0; int rt=0; int isl[100005]; struct segtree{ int info[400005]; int lz[400006]; void push(int st,int en,int i){ if(lz[i]==0)return; info[i]=(en-st+1-info[i]); if(st!=en)lz[i*2]^=lz[i],lz[i*2+1]^=lz[i]; lz[i]=0; } void inv(int st,int en,int i,int l,int r){ push(st,en,i); if(st>r||en<l)return; if(st>=l&&en<=r)return lz[i]=1,push(st,en,i); int m=(st+en)/2; inv(st,m,i*2,l,r); inv(m+1,en,i*2+1,l,r); info[i]=info[i*2]+info[i*2+1]; } void build(int st,int en,int i){ if(st==en){ return void(info[i]=val[st]); } int m=(st+en)/2; build(st,m,i*2); build(m+1,en,i*2+1); info[i]=info[i*2]+info[i*2+1]; //cerr<<"info:"<<i<<" "<<info[i*2]<<"+"<<info[i*2+1]<<"\n"; } }tr; void dfssz(int u,int p){ sz[u]=1; for(auto x:adj[u]){ if(x==p)continue; dfssz(x,u); sz[u]+=sz[x]; if(sz[hv[u]]<sz[x])hv[u]=x; } } void dfs(int u,int p,int h){ in[u]=++cur; //cerr<<"in:"<<u<<" "<<in[u]<<"\n"; hd[u]=h; pa[u]=p; if(hv[u])dfs(hv[u],u,h); for(auto x:adj[u])if(x!=p&&x!=hv[u]){ dfs(x,u,x); } out[u]=cur; } void init(int u,int p){ int ch=0; for(auto x:adj[u])if(x!=p){ init(x,u); val[in[u]]^=val[in[x]]; ch++; } if(ch==0){ val[in[u]]=1; cnt++; isl[u]=1; //cerr<<"ch:"<<u<<"\n"; } //cerr<<"val:"<<u<<" "<<val[in[u]]<<"\n"; } void rv(int x){ int temp=x; //cerr<<"Rv:"<<temp<<"\n"; while(temp){ int h=hd[temp]; tr.inv(1,n,1,in[h],in[temp]); //cerr<<in[h]<<" "<<in[temp]<<"\n"; temp=pa[h]; } } int vis[100005]; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin>>n>>q; for(int i=1;i<n;i++){ int u,v;cin>>u>>v; adj[u].push_back(v); adj[v].push_back(u); } for(int i=1;i<=n;i++)if(adj[i].size()!=1){ rt=i; break; } //cerr<<"rt:"<<rt<<"\n"; dfssz(rt,0); dfs(rt,0,rt); init(rt,0); tr.build(1,n,1); //cerr<<"work\n"; //cerr<<cnt<<"\n"; //cerr<<tr.info[1]<<"\n"; for(int i=0;i<q;i++){ int d;cin>>d; vector<int>v; vector<int>lf; int temp=cnt; for(int j=0;j<d;j++){ int x;cin>>x; temp++; if(isl[x]&&vis[x]==0)temp--,lf.push_back(x),vis[x]=1; else{ v.push_back(x); rv(x); //cerr<<"rv:"<<x<<"\n"; } } //cerr<<"Q:"<<temp<<"\n"; if(temp%2==0)cout<<(2*(n-1)-tr.info[1]+d)<<"\n"; else cout<<"-1\n"; for(auto x:lf)vis[x]=0; for(auto x:v)rv(x); } }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...