Submission #1270979

#TimeUsernameProblemLanguageResultExecution timeMemory
1270979thanhcodedaoSpring cleaning (CEOI20_cleaning)C++20
18 / 100
144 ms21572 KiB
/*Dep trai co j sai*/ /*IOI here we go*/ #include <bits/stdc++.h> using namespace std; #define ll long long #define fi first #define se second #define pu push_back const int N=1e5; ll mod=1e9+7,oo=1e18; int n,q,d[N+10],tt[22][N+10],cnt,in[N+10],sz[N+10]; vector <int> adj[N+10]; int a[N+10]; vector <int> la; bool o[N+10],g[N+10]; void dfs(int u,int p){ in[u]=++cnt; for(int v:adj[u]){ if(v==p) continue; tt[0][v]=u; d[v]=d[u]+1; dfs(v,u); } } int lca(int u,int v){ if(d[u]<d[v]) swap(u,v); for(int i=20;i>=0;--i){ int pu=tt[i][u]; if(d[pu]>=d[v]) u=pu; } if(u==v) return u; for(int i=20;i>=0;--i){ int pu=tt[i][u],pv=tt[i][v]; if(pu!=pv){ u=pu; v=pv; } } return tt[0][u]; } bool cmp(int a,int b){ return in[a]<in[b]; } bool cmp2(int a,int b){ if(d[a]!=d[b]) return d[a]<d[b]; return in[a]<in[b]; } void sub1(){ sort(la.begin(),la.end(),cmp2); int res=0; int m=la.size(); for(int i=0;i<m/2;i++){ int u=la[i],v=la[m-i-1]; int x=lca(u,v); //cout<<u<<" "<<v<<" "<<x<<" "<<d[u]+d[v]-2*d[x]<<'\n'; res+=d[u]+d[v]-2*d[x]; } while(q--){ int D; cin>>D; int ans=0; vector <int> l; for(int i=1;i<=D;i++) {cin>>a[i]; ans++; sz[a[i]]++; if(!g[a[i]]){ l.pu(a[i]); g[a[i]]=true; } } for(int i=1;i<=D;i++){ if(sz[a[i]]%2==0){ l.pu(a[i]); sz[a[i]]--; } } if(la.size()%2==1){ l.pu(la[la.size()/2]); } sort(l.begin(),l.end(),cmp); int m=l.size(); // cout<<m<<" "; // for(int u:l) cout<<u<<' '; // cout<<'\n'; if(m%2==1){ for(int i=1;i<=D;i++){ g[a[i]]=o[a[i]]; sz[a[i]]=0; } cout<<-1<<'\n'; continue; } for(int i=0;i<m-1;i+=2){ int u=l[i],v=l[i+1]; int x=lca(u,v); //cout<<u<<" "<<v<<" "<<x<<" "<<d[u]+d[v]-2*d[x]<<'\n'; ans+=d[u]+d[v]-2*d[x]; } for(int i=1;i<=D;i++){ g[a[i]]=o[a[i]]; sz[a[i]]=0; } cout<<ans+res<<'\n'; } } void tinh(){ cin>>n>>q; //for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<n;i++){ int u,v; cin>>u>>v; adj[u].pu(v); adj[v].pu(u); } for(int i=1;i<=n;i++) if(adj[i].size()==1) {la.pu(i); o[i]=g[i]=true; } d[1]=1; dfs(1,0); for(int i=1;i<=20;i++){ for(int j=1;j<=n;j++) tt[i][j]=tt[i-1][tt[i-1][j]]; } sub1(); } int main(){ ios_base::sync_with_stdio(NULL); cin.tie(NULL); cout.tie(NULL); // freopen("crt.inp","r",stdin); // freopen("crt.out","w",stdout); tinh(); 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...