Submission #291190

#TimeUsernameProblemLanguageResultExecution timeMemory
291190TadijaSebezSpring cleaning (CEOI20_cleaning)C++11
100 / 100
409 ms17544 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back const int N=200050; int deg[N]; vector<int> E[N]; const int M=2*N; int root,ls[M],rs[M],sum[M],tsz,lzy[M]; void Flip(int&c,int ss,int se,int qs,int qe){ if(qs>qe||qs>se||ss>qe)return; if(!c)c=++tsz; if(qs<=ss&&qe>=se){sum[c]=se-ss+1-sum[c];lzy[c]^=1;return;} int mid=ss+se>>1; Flip(ls[c],ss,mid,qs,qe); Flip(rs[c],mid+1,se,qs,qe); sum[c]=sum[ls[c]]+sum[rs[c]]; if(lzy[c])sum[c]=se-ss+1-sum[c]; } int head[N],lid[N],rid[N],tid,sz[N],par[N]; void DFS(int u,int p){ sz[u]=1;par[u]=p; for(int v:E[u])if(v!=p)DFS(v,u),sz[u]+=sz[v]; } void HLD(int u,int p){ lid[u]=++tid; if(!head[u])head[u]=u; int hc=0; for(int v:E[u])if(v!=p&&sz[hc]<sz[v])hc=v; if(hc!=0){ head[hc]=head[u]; HLD(hc,u); for(int v:E[u])if(v!=p&&v!=hc)HLD(v,u); } rid[u]=tid; } void Flip(int u){ while(u>0){ Flip(root,2,tid,lid[head[u]],lid[u]); u=par[head[u]]; } } int main(){ int n,q; scanf("%i %i",&n,&q); for(int i=1,u,v;i<n;i++){ scanf("%i %i",&u,&v); E[u].pb(v);E[v].pb(u); deg[u]++;deg[v]++; } DFS(1,0); HLD(1,0); int leaf=0; for(int i=1;i<=n;i++)if(deg[i]==1)Flip(i),leaf++; for(int i=1;i<=q;i++){ int k;scanf("%i",&k); vector<int> p(k); for(int&j:p){ scanf("%i",&j); deg[j]++; if(deg[j]!=2){ leaf++; Flip(j); } } if(leaf%2==1)printf("-1\n"); else printf("%i\n",n-1+k+n-1-sum[root]); reverse(p.begin(),p.end()); for(int j:p){ deg[j]--; if(deg[j]!=1){ leaf--; Flip(j); } } } return 0; }

Compilation message (stderr)

cleaning.cpp: In function 'void Flip(int&, int, int, int, int)':
cleaning.cpp:13:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   13 |  int mid=ss+se>>1;
      |          ~~^~~
cleaning.cpp: In function 'int main()':
cleaning.cpp:44:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   44 |  scanf("%i %i",&n,&q);
      |  ~~~~~^~~~~~~~~~~~~~~
cleaning.cpp:46:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   46 |   scanf("%i %i",&u,&v);
      |   ~~~~~^~~~~~~~~~~~~~~
cleaning.cpp:55:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   55 |   int k;scanf("%i",&k);
      |         ~~~~~^~~~~~~~~
cleaning.cpp:58:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   58 |    scanf("%i",&j);
      |    ~~~~~^~~~~~~~~
#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...