Submission #888553

#TimeUsernameProblemLanguageResultExecution timeMemory
888553SzypkiBillSpring cleaning (CEOI20_cleaning)C++17
28 / 100
1074 ms15980 KiB
#include <bits/stdc++.h> #define int long long #define pii pair<int,int> #define all(x) x.begin(),x.end() #define vi vector<int> #define vii vector<pii> #define siz(x) (int)x.size() #define pb push_back #define rep(i,x) for(int i=0; i<x; i++) #define rep1(i,x) for(int i=1; i<=x; i++) using namespace std; const int inf = 1e9, maxn = 1e5+5, mod = 1e9+7; int n,q,ileparzystych,ilelisci,korzen = 1; int liscie[maxn]; bool parzyste[maxn]; int parent[maxn]; int aktsiz[maxn]; vi graf[maxn]; void DFS(int v, int p){ parent[v] = p; if(siz(graf[v])==1){liscie[v] = 1;ilelisci++;} for(auto u:graf[v])if(u!=p){ DFS(u,v); liscie[v]+=liscie[u]; } parzyste[v] = !(liscie[v]%2); if(parzyste[v] && v!=korzen)ileparzystych++; } int32_t main(){ ios_base::sync_with_stdio(0);cin.tie(0); cin>>n>>q; rep(i,n-1){ int a,b; cin>>a>>b; graf[a].pb(b); graf[b].pb(a); aktsiz[a]++; aktsiz[b]++; } DFS(korzen,0); // cout<<"pr ileparzystych: "<<ileparzystych<<" ilelisci: "<<ilelisci<<" "; for(int i=1; i<=n; i++)cout<<aktsiz[i]<<' ';cout<<'\n'; rep(i,q){ int d; cin>>d; unordered_map<int,int> M; rep(j,d){ int x; cin>>x; M[x]++; } for(auto [a,b] : M){ if((b%2 == 0 && siz(graf[a])>1)||(b%2 && siz(graf[a])==1))continue; int x = a,x2 = a; if(aktsiz[x] > 1)ilelisci+=b; else ilelisci+=(b-1); int f = 1; if(b>1)f--; if(aktsiz[x] > f) while(x!=korzen){ parzyste[x] = !parzyste[x]; if(parzyste[x])ileparzystych++; else ileparzystych--; x = parent[x]; } aktsiz[x2]+=b; } // cout<<"in ileparzystych: "<<ileparzystych<<" ilelisci: "<<ilelisci<<" "; for(int i=1; i<=n; i++)cout<<aktsiz[i]<<' ';cout<<'\n'; if((ilelisci)&1)cout<<-1<<'\n'; else cout<<n-1+d+ileparzystych<<'\n'; for(auto [a,b] : M){ if((b%2 == 0 && siz(graf[a])>1)||(b%2 && siz(graf[a])==1))continue; int x = a; aktsiz[x]-=b; if(aktsiz[x] > 1)ilelisci-=b; else ilelisci-=(b-1); int f = 1; if(b>1)f--; if(aktsiz[x] > f) while(x!=korzen){ parzyste[x] = !parzyste[x]; if(parzyste[x])ileparzystych++; else ileparzystych--; x = parent[x]; } } // cout<<"po ileparzystych: "<<ileparzystych<<" ilelisci: "<<ilelisci<<" "; for(int i=1; i<=n; i++)cout<<aktsiz[i]<<' ';cout<<'\n'; } }
#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...