제출 #1310166

#제출 시각아이디문제언어결과실행 시간메모리
1310166LudisseySpring cleaning (CEOI20_cleaning)C++20
34 / 100
1096 ms29244 KiB
#include <bits/stdc++.h>
#define int long long
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
 
using namespace std;

const int MAX=1e5;
vector<vector<int>> neigh;
vector<vector<int>> neigh2;
vector<int> parent;
vector<int> depth;
vector<int> val;
int csum=0;
int root=0;

void dfs(int x, int p, int d){
    parent[x]=p;
    depth[x]=d;
    val[x]=0;
    for (auto u : neigh[x])
    {
        if(u==p) continue;
        dfs(u,x,d+1);
        val[x]+=val[u];
        csum+=val[u]-1;
    }
    for (auto u : neigh2[x])
    {
        if(u==p) continue;
        dfs(u,x,d+1);
        val[x]+=val[u];
    }
    if(sz(neigh[x])+sz(neigh2[x])==1&&x!=root) {
        val[x]=1;
    }
    val[x]=2-val[x]%2;
}

signed main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    int n,q; cin >> n >> q;
    neigh.resize(n+MAX);
    neigh2.resize(n+MAX);
    parent.resize(n+MAX,-1);
    val.resize(n+MAX,-1);
    depth.resize(n+MAX,-1);


    for (int i = 0; i < n-1; i++)
    {
        int u,v; cin >> u >> v; u--; v--;
        neigh[u].push_back(v);
        neigh[v].push_back(u);
        if(sz(neigh[u])>1) root=u;
        if(sz(neigh[v])>1) root=v;
    }
    for (int i = 0; i < q; i++)
    {
        int D; cin >> D;
        vector<int> d(D);
        for (int i = 0; i < D; i++) cin >> d[i];
        for (int i = 0; i < D; i++)
        {
            assert(d[i]-1<n);
            neigh2[d[i]-1].push_back(i+n);
            neigh2[i+n].push_back(d[i]-1);
        }
        
        csum=n-1+D;
        dfs(root,-1,0);
        if(val[root]==1) cout << -1 << "\n";
        else cout << csum << "\n";
        for (int i = 0; i < D; i++) neigh2[d[i]-1].pop_back(),neigh2[n+i].pop_back();
    }
    
    return 0;
}   
#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...