Submission #1282931

#TimeUsernameProblemLanguageResultExecution timeMemory
1282931HiepVu217Spring cleaning (CEOI20_cleaning)C++20
100 / 100
172 ms17132 KiB
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;

int n,q,sz[N],parv[N],head[N],pos[N],ar[N],ch[N],zp=0,zch=1;
int d[N],a[N],cntLeaf=0;
bool lz[4*N];
vector<int> adj[N];

struct node{
    int c1,c2;
    node operator+(const node&o)const{return{c1+o.c1,c2+o.c2};}
} st[4*N];

int ans=0;

void dfs(int u,int p){
    sz[u]=1;parv[u]=p;
    a[u]=(d[u]==1);cntLeaf+=(d[u]==1);
    for(int v:adj[u]){
        if(v==p)continue;
        dfs(v,u);
        sz[u]+=sz[v];
        a[u]+=a[v];
    }
    if(u>1) ans+=(a[u]%2?1:2);
}

void hld(int u,int p){
    if(!head[zch]) head[zch]=u;
    ch[u]=zch; pos[u]=++zp; ar[zp]=u;
    int bc=0;
    for(int v:adj[u]) if(v!=p && sz[v]>sz[bc]) bc=v;
    if(bc) hld(bc,u);
    for(int v:adj[u]) if(v!=p && v!=bc){ ++zch; hld(v,u); }
}

void build(int id,int l,int r){
    if(l==r){
        st[id]={a[ar[l]]%2==1,a[ar[l]]%2==0};
        return;
    }
    int mid=(l+r)>>1;
    build(id*2,l,mid);build(id*2+1,mid+1,r);
    st[id]=st[id*2]+st[id*2+1];
}

void down(int id){
    swap(st[id*2].c1,st[id*2].c2);
    lz[id*2]^=lz[id];
    swap(st[id*2+1].c1,st[id*2+1].c2);
    lz[id*2+1]^=lz[id];
    lz[id]=0;
}

void update(int id,int l,int r,int u,int v){
    if(v<l||r<u)return;
    if(u<=l&&r<=v){
        ans-=st[id].c1+st[id].c2*2;
        swap(st[id].c1,st[id].c2);
        ans+=st[id].c1+st[id].c2*2;
        lz[id]^=1;
        return;
    }
    if(lz[id]) down(id);
    int mid=(l+r)>>1;
    update(id*2,l,mid,u,v);
    update(id*2+1,mid+1,r,u,v);
    st[id]=st[id*2]+st[id*2+1];
}

void change(int u,int v){
    while(ch[u]!=ch[v]){
        update(1,1,n,pos[head[ch[u]]],pos[u]);
        u=parv[head[ch[u]]];
    }
    update(1,1,n,pos[v]+1,pos[u]);
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin>>n>>q;
    for(int i=1,u,v;i<n;i++){
        cin>>u>>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
        ++d[u]; ++d[v];
    }

    dfs(1,0);
    hld(1,0);
    build(1,1,n);

    for(int i=1,m;i<=q;i++){
        cin>>m;
        vector<int>b(m);
        for(int j=0;j<m;j++){
            int u;cin>>u;b[j]=u;
            if(d[u]==1)--cntLeaf; else change(u,1);
            ++d[u];++cntLeaf;++ans;
        }
        if(cntLeaf&1) cout<<"-1\n";
        else cout<<ans<<"\n";
        for(int u:b){
            --d[u];--ans;--cntLeaf;
            if(d[u]==1)++cntLeaf; else change(u,1);
        }
    }
}
#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...