답안 #342426

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
342426 2021-01-02T06:13:46 Z mjhmjh1104 Spring cleaning (CEOI20_cleaning) C++14
18 / 100
135 ms 20504 KB
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

const int MAX = 100006;

int n, q, d, childs[MAX], cntChilds[MAX], depth[MAX], totalChilds[MAX];
vector<int> adj[MAX], c[MAX];

void dfs(int x, int prev = -1) {
    for (auto &i: adj[x]) if (i != prev) {
        depth[i] = depth[x] + 1;
        dfs(i, x);
        c[x].push_back(i);
    }
}

void dfs1(int x) {
    totalChilds[x] = cntChilds[x];
    for (auto &i: c[x]) {
        dfs1(i);
        totalChilds[x] += totalChilds[i];
    }
}

int main() {
    scanf("%d%d", &n, &q);
    for (int i = 0; i < n - 1; i++) {
        int a, b;
        scanf("%d%d", &a, &b);
        a--, b--;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    dfs(0);
    while (q--) {
        for (int i = 0; i < n; i++) childs[i] = cntChilds[i] = 0;
        scanf("%d", &d);
        for (int i = 0; i < d; i++) {
            int x;
            scanf("%d", &x); x--;
            childs[x]++;
        }
        cntChilds[0] += childs[0];
        if (!childs[0] && (int)c[0].size() == 1) cntChilds[0]++;
        for (int i = 1; i < n; i++) {
            cntChilds[i] += childs[i];
            if (!childs[i] && c[i].empty()) cntChilds[i]++;
        }
        dfs1(0);
        if (totalChilds[0] % 2) return puts("-1"), 0;
        long long res = d;
        for (int i = 1; i < n; i++) {
            int t = totalChilds[i];
            if (t > 2) t -= (t - 1) / 2 * 2;
            res += t;
        }
        printf("%lld\n", res);
    }
}

Compilation message

cleaning.cpp: In function 'int main()':
cleaning.cpp:28:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   28 |     scanf("%d%d", &n, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~
cleaning.cpp:31:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   31 |         scanf("%d%d", &a, &b);
      |         ~~~~~^~~~~~~~~~~~~~~~
cleaning.cpp:39:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   39 |         scanf("%d", &d);
      |         ~~~~~^~~~~~~~~~
cleaning.cpp:42:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   42 |             scanf("%d", &x); x--;
      |             ~~~~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 4972 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 18 ms 5228 KB Output is correct
2 Correct 15 ms 5228 KB Output is correct
3 Correct 43 ms 10600 KB Output is correct
4 Correct 41 ms 8940 KB Output is correct
5 Correct 53 ms 10600 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 5740 KB Output is correct
2 Correct 16 ms 5740 KB Output is correct
3 Correct 72 ms 20504 KB Output is correct
4 Correct 78 ms 19180 KB Output is correct
5 Correct 62 ms 19052 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 135 ms 7404 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 45 ms 9068 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 91 ms 11372 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 4972 KB Output isn't correct
2 Halted 0 ms 0 KB -