답안 #578135

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
578135 2022-06-16T05:36:47 Z talant117408 Spring cleaning (CEOI20_cleaning) C++17
35 / 100
386 ms 24748 KB
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;

#define long                unsigned long 
#define pb                  push_back
#define mp                  make_pair
#define all(v)              (v).begin(),(v).end()
#define rall(v)             (v).rbegin(),(v).rend()
#define lb                  lower_bound
#define ub                  upper_bound
#define sz(v)               int((v).size())
#define do_not_disturb      ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl                '\n'

const int N = 2e5+7;
vector <vector <int>> graph(N), new_graph(N);
int root, subtree[N], depth[N], parent[N], nw[N];
ll ans;

void dfs(int v, int p) {
    subtree[v] = (sz(new_graph[v]) == 1 ? 1 : 0);
    parent[v] = p;
    for (auto to : new_graph[v]) {
        if (to == p) {
            continue;
        }
        depth[to] = depth[v] + 1;
        dfs(to, v);
        subtree[v] += subtree[to];
    }
    ans += 2 - (subtree[v] % 2);
}

int get(int n) {
    ans = 0;
    for (int i = 1; i <= n; i++) {
        if (sz(new_graph[i]) > 1) {
            root = i;
        }
    }
    dfs(root, root);
    if (subtree[root]&1) return -1;
    else return ans-2;
}

void subtask5(int n, int q) {
    for (int i = 1; i <= n; i++) {
        new_graph[i].clear();
        for (auto to : graph[i]) new_graph[i].pb(to);
    }
    dfs(1, 1);
    auto res = ans-2;
    int l = int(log2(n))+1;
    if (n != (1 << l) - 1) return;
    int mn = 2e9, mx = -2e9;
    for (int i = 1; i <= n; i++) {
        if (sz(graph[i]) == 1) {
            mn = min(mn, depth[i]);
            mx = max(mx, depth[i]);
        }
    }
    if (mx != mn) return;
    
    while (q--) {
        int k;
        cin >> k;
        res += k;
        vector <int> D(k);
        for (auto &to : D) cin >> to;
        for (auto to : D) {
            auto x = to;
            if (sz(graph[x]) == 1) {
                nw[x]++;
            }
            if (sz(graph[x]) == 1 && nw[x] == 1) continue;
            while (x != parent[x]) {
                subtree[x]++;
                if (subtree[x]&1) res--;
                else res++;
                x = parent[x];
            }  
            subtree[1]++;
        }
        
        if (subtree[1]&1) cout << -1 << endl;
        else cout << res << endl;
        
        for (auto to : D) {
            auto x = to;
            if (sz(graph[x]) == 1) {
                nw[x]--;
            }
            if (sz(graph[x]) == 1 && nw[x] == 0) continue;
            while (x != parent[x]) {
                if (subtree[x]&1) res++;
                else res--;
                subtree[x]--;
                x = parent[x];
            }
            subtree[1]--;
        }
        res -= k;
    }
    exit(0);
}

void solve() {
    int n, q;
    cin >> n >> q;
    for (int i = 1; i < n; i++) {
        int a, b;
        cin >> a >> b;
        graph[a].pb(b);
        graph[b].pb(a);
    }
    subtask5(n, q);
    if (n <= 20000 && q <= 300) {
        while (q--) {
            int vertex = n+1;
            int k;
            cin >> k;
            for (int i = 1; i <= n+k; i++) {
                new_graph[i].clear();
                for (auto to : graph[i]) new_graph[i].pb(to);
            }
            while (k--) {
                int x;
                cin >> x;
                new_graph[x].pb(vertex);
                new_graph[vertex].pb(x);
                vertex++;
            }
            cout << get(vertex-1) << endl;
        }
    }
    else {
        for (int i = 1; i <= n; i++) {
            new_graph[i].clear();
            for (auto to : graph[i]) new_graph[i].pb(to);
        }
        dfs(1, 1);
        if (sz(graph[1]) == 1) subtree[1]--;
        ans -= 2;
        while (q--) {
            int k;
            cin >> k;
            ans += k;
            while (k--) {
                int x;
                cin >> x;
            }
            if (subtree[1]&1) {
                if (k&1) cout << ans << endl;
                else cout << -1;
            }
            else if (k&1) cout << -1 << endl;
            else cout << ans << endl;
            ans -= k;
        }
    }
}

int main() {
    do_not_disturb
    
    int t = 1;
    //~ cin >> t;
    while (t--) {
        solve();
    }
    
    return 0;
}
/*
7 5
1 2
1 3
2 4
2 5
3 6
3 7
1 1
2 1 1
2 7 7
2 6 7
2 4 7
*/
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 9684 KB Output is correct
2 Incorrect 27 ms 11284 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 13884 KB Output is correct
2 Correct 22 ms 13836 KB Output is correct
3 Incorrect 56 ms 17880 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 28 ms 14352 KB Output is correct
2 Correct 35 ms 14384 KB Output is correct
3 Incorrect 60 ms 24748 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 333 ms 11972 KB Output is correct
2 Correct 251 ms 11468 KB Output is correct
3 Correct 315 ms 11256 KB Output is correct
4 Correct 374 ms 11748 KB Output is correct
5 Correct 310 ms 11948 KB Output is correct
6 Correct 386 ms 12048 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 53 ms 15100 KB Output is correct
2 Correct 54 ms 14796 KB Output is correct
3 Correct 50 ms 12332 KB Output is correct
4 Correct 76 ms 14908 KB Output is correct
5 Correct 68 ms 14884 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 89 ms 18040 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 9684 KB Output is correct
2 Incorrect 27 ms 11284 KB Output isn't correct
3 Halted 0 ms 0 KB -