제출 #1282894

#제출 시각아이디문제언어결과실행 시간메모리
1282894goldencheemsSpring cleaning (CEOI20_cleaning)C++20
17 / 100
201 ms15296 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pu push_back typedef pair <long,long> ii; const int N=1e6; long long mod=1e9; int n; int a[N+1],d[N+1],sz[N+1],pa[N+1],head[N+1],pos[N+1],arr[N+1],curchain=1,chainid[N+1],curpos=1,ss[N+10],ans,lazy[N*4+10],root,res,lnum; vector <int> adj[N+1]; bool leaf[N+10],o[N+10]; struct Node{ int c1,c2; Node operator + (const Node &o) const{ return {c1+o.c1,c2+o.c2}; } }; Node node[4*N+1]; void dfs(int u,int p){ sz[u]=1; if(adj[u].size()==1 and p){ ss[u]=1; leaf[u]=true; o[u]=true; lnum++; } for(auto v:adj[u]){ if(v==p) continue; pa[v]=u; d[v]=d[u]+1; dfs(v,u); sz[u]+=sz[v]; ss[u]+=ss[v]; } } void hld(int u,int p){ if(head[curchain]==0) head[curchain]=u; chainid[u]=curchain; pos[u]=curpos; arr[curpos]=u; curpos++; int nxt=0; for(auto v:adj[u]){ if(v==p) continue; if(nxt==0 || sz[v]>sz[nxt]) nxt=v; } if(nxt) hld(nxt,u); for(auto v:adj[u]){ if(v!=p && v!=nxt){ curchain++; hld(v,u); } } } int lca(int u,int v){ while(chainid[u]!=chainid[v]){ if(chainid[u]>chainid[v]) u=pa[head[chainid[u]]]; else v=pa[head[chainid[v]]]; } if(d[u]>d[v]) return v; else return u; } void add(int id,int w){ if(w%2==1){ ans-=node[id].c1+node[id].c2*2; swap(node[id].c1,node[id].c2); ans+=node[id].c1+node[id].c2*2; lazy[id]+=w; } } void down(int id){ int t=lazy[id]; add(id*2,t); add(id*2+1,t); lazy[id]=0; } void Build(int id,int l,int r){ if(l==r){ if(arr[l]==root) return; node[id].c1=(ss[arr[l]]%2==1); node[id].c2=(ss[arr[l]]%2==0); res+=node[id].c1+node[id].c2*2; return; } int mid=(l+r)/2; Build(id*2,l,mid); Build(id*2+1,mid+1,r); node[id]=node[id*2]+node[id*2+1]; } void Update(int id,int l,int r,int u,int v){ if(l>v or r<u) return; if(l>=u and r<=v){ add(id,1); return; } down(id); int mid=(l+r)/2; Update(id*2,l,mid,u,v); Update(id*2+1,mid+1,r,u,v); node[id]=node[id*2]+node[id*2+1]; } void Upd(int u,int v){ int x=lca(u,v); while(chainid[u]!=chainid[x]){ Update(1,1,n,pos[head[chainid[u]]],pos[u]); u=pa[head[chainid[u]]]; } while(chainid[v]!=chainid[x]){ Update(1,1,n,pos[head[chainid[v]]],pos[v]); v=pa[head[chainid[v]]]; } if(d[u]>d[v]){ Update(1,1,n,pos[v],pos[u]); } else Update(1,1,n,pos[u],pos[v]); } void tinh(){ int q; cin>>n; cin>>q; for(int i=1;i<n;i++){ int u,v; cin>>u>>v; adj[u].pu(v); adj[v].pu(u); } root=1; for(int i=1;i<=n;i++){ if(adj[i].size()>1){ root=i; break; } } dfs(root,0); hld(root,0); Build(1,1,n); //cout<<res<<" "<<root<<'\n'; while(q--){ ans=res; int k; cin>>k; int l2=lnum; vector <int> z; for(int i=1;i<=k;i++){ cin>>a[i]; ans++; //out<<ans<<" "<<a[i]<<'\n'; if(a[i]==root) { l2++; continue ; } if(o[a[i]]){ o[a[i]]=false; } else{ l2++; Upd(root,a[i]); z.pu(a[i]); } //cout<<ans<<" "; } if(l2%2==1){ cout<<-1<<'\n'; for(int x:z) Upd(root,x); continue; } cout<<ans<<'\n'; for(int i=1;i<=k;i++){ if(leaf[a[i]]) o[a[i]]=true; } for(int x:z) Upd(root,x); } } int main(){ //freopen("jday.inp","r",stdin); //freopen("jday.out","w",stdout); ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); tinh(); return 0; } //code của anh Nam đẹp trai nhất CHL
#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...