답안 #602041

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
602041 2022-07-22T14:03:39 Z AA_Surely 수도 (JOI20_capital_city) C++14
41 / 100
3000 ms 40264 KB
#include <bits/stdc++.h>

#define FOR(i,x,n) 	for(int i=x; i<n; i++)
#define F0R(i,n) 	FOR(i,0,n)
#define ROF(i,x,n) 	for(int i=n-1; i>=x; i--)
#define R0F(i,n) 	ROF(i,0,n)

#define WTF 		cout << "WTF" << endl

#define IOS 		ios::sync_with_stdio(false); cin.tie(0)
#define F 			first
#define S	 		second
#define pb 			push_back

#define ALL(x) 		x.begin(), x.end()
#define RALL(x) 	x.rbegin(), x.rend()

using namespace std;
typedef long long 		LL;

typedef pair<int, int> 	PII;
typedef pair<LL, LL> 	PLL;

typedef vector<int> 	VI;
typedef vector<LL> 		VLL;
typedef vector<PII> 	VPII;
typedef vector<PLL> 	VPLL;

const int N = 2e5 + 7;
const int ALPHA = 27;
const int INF = 1e9 + 7;
const int MOD = 1e9 + 7;
const int LOG = 22;

int n, k, vcnt;
int eset[N][2], ns[N];
int comp[N], par[N], sz[N];
bool valid[N], vis[N];
VI adj[N], rs, group[N];

void init() {
    cin >> n >> k;
    F0R(i, n - 1) {
        cin >> eset[i][0] >> eset[i][1];
        eset[i][0]--; eset[i][1]--;
    }

    F0R(i, n) {
        cin >> ns[i];
        ns[i]--;
        group[ ns[i] ].pb(i);
    }

    fill(valid, valid + k, 1);
    vcnt = k;
    return;
}

void preD(int now, int c) {
    vis[now] = 1;
    comp[now] = c;

    for(int on : adj[now]) if (!vis[on]) preD(on, c);
    return;
}

bool buildGraph() {
    F0R(i, n) adj[i].clear();
    rs.clear();

    F0R(i, n - 1) {
        if (valid[ ns[ eset[i][0] ] ] && valid[ ns[ eset[i][1] ] ]) {
            adj[ eset[i][0] ].pb(eset[i][1]);
            adj[ eset[i][1] ].pb(eset[i][0]);
        }
    }
    
    memset(vis, 0, sizeof vis);

    int c = 0;
    F0R(i, n) if (!vis[i]) {
        rs.pb(i);
        preD(i, c);
        c++;
    }
    
    F0R(i, k) {
        FOR(j, 1, group[i].size()) {
            if (valid[i] && comp[ group[i][j] ] != comp[ group[i][j - 1] ]) {
                vcnt--;
                valid[i] = 0;
            }
        }
    }

    return 1;
}

int getSz(int now, int p) {
    sz[now] = 1;
    for(int on : adj[now]) if (on != p) sz[now] += getSz(on, now);
    return sz[now];
}

int getCent(int now, int p, int s) {
    for(int on : adj[now]) if (on != p) 
        if (sz[on] > (s / 2)) return getCent(on, now, s);
    return now;
}

void getPar(int now, int p) {
    par[now] = p;
    for(int on : adj[now]) if (on != p) getPar(on, now);
    return;
}

int solve(int root) {
    getSz(root, -1);
    int c = getCent(root, -1, sz[root]);
    getPar(c, -1);

    int ret = 0;
    if (!valid[ ns[c] ]) return INF;

    queue<int> keep;
    keep.push(ns[c]);
    vis[ ns[c] ] = 1;

    while(!keep.empty()) {
        int now = keep.front();
        keep.pop();

        for(int on : group[now]) {
            int p = par[on];
            if (p == -1) continue;
            if (!valid[ ns[p] ]) return INF;
            if (!vis[ ns[p] ]) {
                keep.push(ns[p]);
                vis[ ns[p] ] = 1;
                ret++;
            }
        }
    }
    
    if (valid[ ns[c] ]) vcnt--;
    valid[ ns[c] ] = 0;
    return ret;
}

int main() {
    IOS;
    
    init();

    int ans = INF;
    while(buildGraph() && vcnt) {
        memset(vis, 0, sizeof vis);
        for(const int &on : rs) {
            ans = min(ans, solve(on));
        }
    }

    cout << ans;
}

Compilation message

capital_city.cpp: In function 'bool buildGraph()':
capital_city.cpp:3:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    3 | #define FOR(i,x,n)  for(int i=x; i<n; i++)
......
   88 |         FOR(j, 1, group[i].size()) {
      |             ~~~~~~~~~~~~~~~~~~~~~  
capital_city.cpp:88:9: note: in expansion of macro 'FOR'
   88 |         FOR(j, 1, group[i].size()) {
      |         ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 9940 KB Output is correct
2 Correct 5 ms 9940 KB Output is correct
3 Correct 5 ms 9820 KB Output is correct
4 Correct 6 ms 9940 KB Output is correct
5 Correct 5 ms 9940 KB Output is correct
6 Correct 9 ms 9940 KB Output is correct
7 Correct 5 ms 9940 KB Output is correct
8 Correct 8 ms 9940 KB Output is correct
9 Correct 5 ms 9940 KB Output is correct
10 Correct 5 ms 9812 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 9940 KB Output is correct
2 Correct 5 ms 9940 KB Output is correct
3 Correct 5 ms 9820 KB Output is correct
4 Correct 6 ms 9940 KB Output is correct
5 Correct 5 ms 9940 KB Output is correct
6 Correct 9 ms 9940 KB Output is correct
7 Correct 5 ms 9940 KB Output is correct
8 Correct 8 ms 9940 KB Output is correct
9 Correct 5 ms 9940 KB Output is correct
10 Correct 5 ms 9812 KB Output is correct
11 Correct 10 ms 10084 KB Output is correct
12 Correct 6 ms 10024 KB Output is correct
13 Correct 6 ms 9992 KB Output is correct
14 Correct 7 ms 9980 KB Output is correct
15 Correct 16 ms 10132 KB Output is correct
16 Correct 9 ms 10068 KB Output is correct
17 Correct 9 ms 10116 KB Output is correct
18 Correct 15 ms 10052 KB Output is correct
19 Correct 10 ms 10132 KB Output is correct
20 Correct 6 ms 10068 KB Output is correct
21 Correct 6 ms 10068 KB Output is correct
22 Correct 7 ms 10088 KB Output is correct
23 Correct 7 ms 10100 KB Output is correct
24 Correct 34 ms 10128 KB Output is correct
25 Correct 9 ms 10172 KB Output is correct
26 Correct 6 ms 10196 KB Output is correct
27 Correct 6 ms 10132 KB Output is correct
28 Correct 7 ms 10068 KB Output is correct
29 Correct 6 ms 10048 KB Output is correct
30 Correct 6 ms 10068 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 152 ms 36192 KB Output is correct
2 Correct 96 ms 36500 KB Output is correct
3 Correct 176 ms 35896 KB Output is correct
4 Correct 91 ms 36524 KB Output is correct
5 Correct 204 ms 34780 KB Output is correct
6 Correct 107 ms 37708 KB Output is correct
7 Correct 185 ms 34908 KB Output is correct
8 Correct 100 ms 37296 KB Output is correct
9 Correct 280 ms 33352 KB Output is correct
10 Correct 290 ms 31204 KB Output is correct
11 Correct 274 ms 33604 KB Output is correct
12 Correct 273 ms 35764 KB Output is correct
13 Correct 266 ms 31020 KB Output is correct
14 Correct 287 ms 35896 KB Output is correct
15 Correct 317 ms 35788 KB Output is correct
16 Correct 286 ms 31680 KB Output is correct
17 Correct 287 ms 32120 KB Output is correct
18 Correct 289 ms 36008 KB Output is correct
19 Correct 351 ms 38700 KB Output is correct
20 Correct 312 ms 40264 KB Output is correct
21 Correct 5 ms 9940 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 9940 KB Output is correct
2 Correct 5 ms 9940 KB Output is correct
3 Correct 5 ms 9820 KB Output is correct
4 Correct 6 ms 9940 KB Output is correct
5 Correct 5 ms 9940 KB Output is correct
6 Correct 9 ms 9940 KB Output is correct
7 Correct 5 ms 9940 KB Output is correct
8 Correct 8 ms 9940 KB Output is correct
9 Correct 5 ms 9940 KB Output is correct
10 Correct 5 ms 9812 KB Output is correct
11 Correct 10 ms 10084 KB Output is correct
12 Correct 6 ms 10024 KB Output is correct
13 Correct 6 ms 9992 KB Output is correct
14 Correct 7 ms 9980 KB Output is correct
15 Correct 16 ms 10132 KB Output is correct
16 Correct 9 ms 10068 KB Output is correct
17 Correct 9 ms 10116 KB Output is correct
18 Correct 15 ms 10052 KB Output is correct
19 Correct 10 ms 10132 KB Output is correct
20 Correct 6 ms 10068 KB Output is correct
21 Correct 6 ms 10068 KB Output is correct
22 Correct 7 ms 10088 KB Output is correct
23 Correct 7 ms 10100 KB Output is correct
24 Correct 34 ms 10128 KB Output is correct
25 Correct 9 ms 10172 KB Output is correct
26 Correct 6 ms 10196 KB Output is correct
27 Correct 6 ms 10132 KB Output is correct
28 Correct 7 ms 10068 KB Output is correct
29 Correct 6 ms 10048 KB Output is correct
30 Correct 6 ms 10068 KB Output is correct
31 Correct 152 ms 36192 KB Output is correct
32 Correct 96 ms 36500 KB Output is correct
33 Correct 176 ms 35896 KB Output is correct
34 Correct 91 ms 36524 KB Output is correct
35 Correct 204 ms 34780 KB Output is correct
36 Correct 107 ms 37708 KB Output is correct
37 Correct 185 ms 34908 KB Output is correct
38 Correct 100 ms 37296 KB Output is correct
39 Correct 280 ms 33352 KB Output is correct
40 Correct 290 ms 31204 KB Output is correct
41 Correct 274 ms 33604 KB Output is correct
42 Correct 273 ms 35764 KB Output is correct
43 Correct 266 ms 31020 KB Output is correct
44 Correct 287 ms 35896 KB Output is correct
45 Correct 317 ms 35788 KB Output is correct
46 Correct 286 ms 31680 KB Output is correct
47 Correct 287 ms 32120 KB Output is correct
48 Correct 289 ms 36008 KB Output is correct
49 Correct 351 ms 38700 KB Output is correct
50 Correct 312 ms 40264 KB Output is correct
51 Correct 5 ms 9940 KB Output is correct
52 Correct 326 ms 27184 KB Output is correct
53 Correct 278 ms 27116 KB Output is correct
54 Correct 242 ms 27076 KB Output is correct
55 Correct 285 ms 27132 KB Output is correct
56 Correct 251 ms 27156 KB Output is correct
57 Correct 233 ms 27060 KB Output is correct
58 Execution timed out 3094 ms 29552 KB Time limit exceeded
59 Halted 0 ms 0 KB -