Submission #1159388

#TimeUsernameProblemLanguageResultExecution timeMemory
1159388adiyerSpring cleaning (CEOI20_cleaning)C++20
0 / 100
1095 ms327680 KiB
#include <bits/stdc++.h>

#define all(x) x.begin(), x.end()
#define pb push_back
#define fi first
#define se second

using namespace std;

typedef long long ll;

const int MAXN = 200005;

int n, q, ans, sz;
int u[MAXN], v[MAXN], dp[MAXN], par[MAXN], dp2[MAXN];

vector < int > g[MAXN], vec;

void dfs(int v, int p){
    dp[v] = (g[v].size() == 1);
    for(int u : g[v]){
        if(u == p) continue;
        dfs(u, v), par[u] = v, dp[v] += dp[u];
    }
    if(v == 1) dp[v] = 0;
    while(dp[v] > 2) dp[v] -= 2;
    ans += dp[v];
    dp2[v] = dp[v];
}

void up(ll v){
    if(v == 1) return;
    ans -= dp[v];
    dp[v]++;
    if(dp[v] > 2) dp[v] -= 2;
    vec.pb(v);
    ans += dp[v];
    up(par[v]);
}

signed main(){
    int d, x, cnt, pcnt = 0, cur;
    vector < int > del;
    cin >> n >> q, sz = n;
    for(int i = 1; i < n; i++) cin >> u[i] >> v[i], g[u[i]].pb(v[i]), g[v[i]].pb(u[i]);
    for(int i = 1; i <= n; i++) pcnt += (g[i].size() == 1);
    dfs(1, 1), cur = ans;
    while(q--){
        vec.clear();
        cnt = pcnt, ans = cur, sz = n, del.clear(), cin >> d;
        while(d--){ 
            cin >> x, del.pb(x); 
            sz++, cnt = cnt + 1 - (g[x].size() == 1);
            g[x].pb(sz), g[sz].pb(x);
            par[sz] = x, up(sz);
        }
        for(auto it : vec) dp[it] = dp2[it];
        if(cnt % 2){ 
            while(!del.empty()) g[del.back()].pop_back(), del.pop_back();
            for(ll i = n + 1; i <= sz; i++) g[i].clear();
            cout << "-1\n"; continue; 
        }
        
        while(!del.empty()) g[del.back()].pop_back(), del.pop_back();
        for(ll i = n + 1; i <= sz; i++) g[i].clear();
        cout << ans << '\n';
    }
}

/* 
g++ cleaning.cpp -o program.exe
program.exe
7 3
1 2
2 4
4 5
5 6
5 7
3 4
1 4
2 2 4
1 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...