답안 #602023

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
602023 2022-07-22T13:50:44 Z AA_Surely 수도 (JOI20_capital_city) C++14
0 / 100
3000 ms 41124 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[root] ]) return INF;

    queue<int> keep;
    keep.push(ns[root]);
    vis[ ns[ root] ] = 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++;
            }
        }
    }
    
    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));
            if (valid[ ns[on] ]) vcnt--;
            valid[ ns[on] ] = 0;
        }
    }

    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 9832 KB Output is correct
2 Correct 5 ms 9852 KB Output is correct
3 Correct 5 ms 9940 KB Output is correct
4 Correct 5 ms 9940 KB Output is correct
5 Correct 5 ms 9824 KB Output is correct
6 Correct 5 ms 9940 KB Output is correct
7 Correct 5 ms 9856 KB Output is correct
8 Incorrect 5 ms 9940 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 9832 KB Output is correct
2 Correct 5 ms 9852 KB Output is correct
3 Correct 5 ms 9940 KB Output is correct
4 Correct 5 ms 9940 KB Output is correct
5 Correct 5 ms 9824 KB Output is correct
6 Correct 5 ms 9940 KB Output is correct
7 Correct 5 ms 9856 KB Output is correct
8 Incorrect 5 ms 9940 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 271 ms 41124 KB Output is correct
2 Execution timed out 3066 ms 40396 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 9832 KB Output is correct
2 Correct 5 ms 9852 KB Output is correct
3 Correct 5 ms 9940 KB Output is correct
4 Correct 5 ms 9940 KB Output is correct
5 Correct 5 ms 9824 KB Output is correct
6 Correct 5 ms 9940 KB Output is correct
7 Correct 5 ms 9856 KB Output is correct
8 Incorrect 5 ms 9940 KB Output isn't correct
9 Halted 0 ms 0 KB -