답안 #585587

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
585587 2022-06-29T05:50:23 Z 박상훈(#8384) Star Trek (CEOI20_startrek) C++17
0 / 100
2 ms 2644 KB
#include <bits/stdc++.h>

typedef long long ll;
using namespace std;
vector<int> adj[100100];
bool _win[100100], _win_pa[100100], _win_root[100100], ok[100100];

void dfs1(int s, int pa = -1){
    int wcnt = 0, lcnt = 0;
    for (auto &v:adj[s]) if (v!=pa){
        dfs1(v, s);
        if (_win[v]) wcnt++;
        else lcnt++;
    }

    if (!lcnt) _win[s] = 0;
    else _win[s] = 1;

    if (lcnt<=1) ok[s] = 1;
}

void dfs2(int s, int pa = -1){
    int wcnt = 0, lcnt = 0;
    for (auto &v:adj[s]) if (v!=pa){
        if (_win[v]) wcnt++;
        else lcnt++;
    }
    if (pa!=-1){
        if (_win_pa[s]) wcnt++;
        else lcnt++;
    }

    for (auto &v:adj[s]) if (v!=pa){
        if (_win[v]) wcnt--;
        else lcnt--;

        if (!lcnt) _win_pa[v] = 0;
        else _win_pa[v] = 1;

        if (_win[v]) wcnt++;
        else lcnt++;
    }

    if (!lcnt) _win_root[s] = 0;
    else _win_root[s] = 1;

    for (auto &v:adj[s]) if (v!=pa) dfs2(v, s);
}

int lscnt = 0;
void dfs3(int s, int pa = -1){
    if (!ok[s]) return;
    if (!_win[s]) lscnt++;
    for (auto &v:adj[s]) if (v!=pa) dfs3(v, s);
}

int main(){
    int n;
    ll d;
    scanf("%d %lld", &n, &d);
    for (int i=1;i<=n-1;i++){
        int x, y;
        scanf("%d %d", &x, &y);
        adj[x].push_back(y);
        adj[y].push_back(x);
    }

    dfs1(1);
    dfs2(1);
    dfs3(1);

    int lcnt = 0;
    for (int i=1;i<=n;i++) if (!_win_root[i]) lcnt++;

    ll ans = 0;
    if (_win[1]) ans = (ll)n*n - (ll)lscnt * lcnt;
    else ans = (ll)lscnt * lcnt;

    printf("%lld\n", ans);
    return 0;
}

Compilation message

startrek.cpp: In function 'int main()':
startrek.cpp:60:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   60 |     scanf("%d %lld", &n, &d);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
startrek.cpp:63:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   63 |         scanf("%d %d", &x, &y);
      |         ~~~~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2644 KB Output is correct
2 Incorrect 2 ms 2644 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 2644 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Incorrect 1 ms 2644 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Incorrect 1 ms 2644 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Incorrect 1 ms 2644 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Incorrect 1 ms 2644 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Incorrect 1 ms 2644 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2644 KB Output is correct
2 Incorrect 2 ms 2644 KB Output isn't correct
3 Halted 0 ms 0 KB -