Submission #1270525

#TimeUsernameProblemLanguageResultExecution timeMemory
1270525goldencheemsSpring cleaning (CEOI20_cleaning)C++20
0 / 100
63 ms21696 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MOD=1e9+7;
const ll inf=1e18;
const int N=1e5+2;
int maxmize(int a,int b){
    return a>b?a:b;
}
int minmize(int a,int b){
    return a<b?a:b;
}
ll Maxmize(ll a,ll b){
    return a>b?a:b;
}
ll Minmize(ll a,ll b){
    return a<b?a:b;
}
int add(int a,int b){
    a=(a+b)%MOD;
    if(a<0)
        a+=MOD;
    return a;
}
int mul(int a,int b){
    return 1LL*a*b%MOD;
}
int pow_mod(int a,int b){
    int s=1;
    while(b){
        if(b&1)
            s=mul(s,a);
        a=mul(a,a);
        b>>=1;
    }
    return s;
}
int n,q,deg[N],p[N][20],lg,d[N],dau,vi[N],L[N],cnt[N];
vector<int>adj[N];
bool leaf[N],ok[N],sus[10],con[N];
vector<int>Q[N],las;
void DFS(int u,int f){
    for(auto&v:adj[u])
        if(v!=f){
            p[v][0]=u;
            d[v]=d[u]+1;
            DFS(v,u);
        }
}
int LCK(int u,int v){
    if(d[u]<d[v])
        swap(u,v);
    for(int i=lg;i>=0;--i)
        if(d[p[u][i]]>=d[v])
            u=p[u][i];
    if(u==v)
        return v;
    for(int i=lg;i>=0;--i)
        if(p[u][i]!=p[v][i]){
            u=p[u][i];
            v=p[v][i];
        }
    return p[u][0];
}
int dist(int u,int v){
    return d[u]+d[v]- (d[LCK(u,v)]<<1);
}
void pre_LCK(){
    for(lg=1;(1<<lg)<=n;++lg);
    --lg;
    p[1][0]=1;
    DFS(1,0);
    for(int i=1;i<=lg;++i)
        for(int u=1;u<=n;++u)
            p[u][i]=p[p[u][i-1]][i-1];
}
bool cmp(int x,int y){
    return d[x]>d[y];
}
void sub1(){
    int ans=0;
    for(int Qi=1;Qi<=q;++Qi){
        int re=0,tru=0;
        for(auto&v:Q[Qi]){
            ++cnt[v];
            if(leaf[v]){
                ++re;
                if(!ok[v]){
                    --tru;
                    ok[v]=true;
                }
            }
            else
                 ++re;
        }
        int la=dau+re+tru;
        for(auto&v:Q[Qi])
            ok[v]=false;
        if(la&1){
            cout<<-1<<'\n';
            return;
        }
    }
    int dem=0;
    for(int i=2;i<=n;++i)
        if(cnt[i]&1){
            ++dem;
            ans+=(cnt[i]-1);
        }
        else if(cnt[i]>0){
            con[i]=true;
            ans+=(cnt[i]-2);
        }
    vector<int>trong;
    for(int u=2;u<=n;++u)
        if(con[u])
            trong.push_back(u);
    ans+=4*trong.size();
    if(dem&1){
        ans+=3;
        ans+=4*(dem-1)/2;
    }
    else
        ans+=2*dem+3;
    vector<int>luu;
    for(int u=2;u<=n;++u)
        if(cnt[u]==0)
            luu.push_back(u);
    ans+=(luu.size());
    if(dem&1)
        --ans;
    //cerr<<luu.size()<<'\n';
    cout<<ans;
}
void sub3(){
    sort(las.begin(),las.end(),cmp);
    int ans=0;
    for(int i=0;i+1<las.size();i+=2)
        ans+=dist(las[i],las[i+1]);
        for(int Qi=1;Qi<=q;++Qi){
            int re=0,tru=0,res=ans;
            for(auto&v:Q[Qi]){
                ++cnt[v];
                if(leaf[v]){
                    ++re;
                    if(!ok[v]){
                        --tru;
                        ok[v]=true;
                    }
                }
                else
                        ++re;
            }
            int la=dau+re+tru;
            for(auto&v:Q[Qi])
                ok[v]=false;
            if(la&1){
                cout<<-1<<'\n';
                continue;
            }
            if(LCK(las[0],Q[Qi][1])==Q[Qi][1])
                res+=2;
            else
                res+=dist(las[0],Q[Qi][1])+1;
            cout<<res<<'\n';
        }

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

    cin>>n>>q;
    memset(sus,true,sizeof(sus));
    for(int i=1;i<n;++i){
        int u,v;
        cin>>u>>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
        ++deg[u];
        ++deg[v];
    }
    for(int u=1;u<=n;++u)
        if(deg[u]==1){
            leaf[u]=true;
            ++dau;
            las.push_back(u);
        }
    pre_LCK();
    for(int Qi=1;Qi<=q;++Qi){
        cin>>L[Qi];
        for(int k=1;k<=L[Qi];++k){
            int v;
            cin>>v;
            Q[Qi].push_back(v);
            if(v==1)
                sus[1]=false;
        }
        if(L[Qi]!=1)
            sus[3]=false;
    }
    for(int i=2;i<=n;++i)
        if(deg[i]>2)
            sus[1]=false;
    if(sus[1]&&q==1)
        sub1();
    else if(sus[3])
        sub3();
    else
        sub3();
    return 0;
}
/*
7 3
1 2
2 4
4 5
5 6
5 7
3 4
1 4
1 6
1 1

7 3
1 2
2 4
4 5
5 6
5 7
3 4
4 1 1 2 6
3 6 6 2
2 2 7

7 1
1 2
1 3
1 4
1 5
1 6
1 7
4 2 3 4 4
*/
#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...