답안 #623486

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
623486 2022-08-05T16:49:17 Z welleyth 수도 (JOI20_capital_city) C++17
1 / 100
3000 ms 40872 KB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;

#define int long long
#define mp make_pair
#define pb push_back

#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx2")

constexpr int INF = (int)2e18;
constexpr int N = (int)2e5 + 111;
constexpr int md = (int)998244353;
constexpr int mdPower = (int)1e9+7 - 1;
constexpr double eps = 1e-7;

typedef __int128 _uint;
typedef long long ll;

mt19937_64 rnd(time(nullptr));

void add(int& a,int b){
    a += b; if(a >= md) a -= md;
}
void sub(int& a,int b){
    a -= b; while(a < 0) a += md;
}
void add(__int128& a,int b){
    a += b;
}
void sub(__int128& a,int b){
    a -= b;
}

int bpow(int a,int b){
    if(b == 0)
        return 1;
    if(b % 2 == 0){
        int t = bpow(a,b>>1);
        return 1ll*t*t%md;
    }
    return 1ll * a*bpow(a,b-1) % md;
}

int inv(int a){
    return bpow(a,md-2);
}

int fac[N],invfac[N];

void init(){
    fac[0] = 1;
    for(int i = 1; i < N; i++){
        fac[i] = (fac[i-1] * i) % md;
    }
    invfac[N-1] = inv(fac[N-1]);
    for(int i = N-2; i >= 0; i--){
        invfac[i] = (invfac[i+1] * (i+1))%md;
    }
    return;
}

//int C(int n,int k){
//    if(k > n)
//        return 0;
//    return fac[n] * invfac[k] % md * invfac[n-k] % md;
//}
//
//int A(int n,int k){
//    if(k > n)
//        return 0;
//    return fac[n] * invfac[n-k] % md;
//}

vector<int> g[N];
int col[N];
vector<int> cities[N];
int sz[N];
int ans = INF;
bool used[N];
bool choosen[N];
int p[N];
int L[N];
int d[N];

void dfs1(int v,int pr = -1){
    sz[v] = 1;
    for(auto& to : g[v]){
        if(to == pr || used[to])
            continue;
        dfs1(to,v);
        sz[v] += sz[to];
    }
    return;
}

int getCentroid(int v,int n,int pr = -1){
    for(auto& to : g[v]){
        if(to == pr || used[to])
            continue;
        if(sz[to] > n/2)
            return getCentroid(to,n,v);
    }
    return v;
}

int CNT = 0;
void dfs3(int v,int pr = -1){
    L[v] = CNT;
    for(auto& to : g[v]){
        if(to == pr || used[to])
            continue;
        p[to] = v;
        d[to] = d[v] + 1;
        dfs3(to,v);
    }
    return;
}

void solve(int v,int pr = -1){
    dfs1(v,pr);
    int C = getCentroid(v,sz[v],pr);
//    cerr << "C = " << C <<s "\n";
    used[C] = true;
    int cur_col = col[C];
    dfs1(C);
    CNT++;
    d[C] = 0;
    dfs3(C);
//    cerr << "ok\n";
    if(!choosen[cur_col]){
        set<int> added_colors;
        added_colors.insert(cur_col);
        set<pair<int,int>> q;
        bool ok = true;
        set<int> visited;
        for(auto& x : cities[cur_col]){
            q.insert(mp(-d[x],x));
            visited.insert(x);
            if(L[x] != CNT){
                ok = false;
                break;
            }
        }
        while(!q.empty() && ok){
            int v = q.begin()->second;
            q.erase(q.begin());
//            cerr << "v = " << v << "\n";
            if(choosen[col[v]]){
                ok = false;
                break;
            }
            if(!added_colors.count(col[v])){
                for(auto& x : cities[col[v]]){
                    if(!visited.count(x)){
                        q.insert(mp(-d[x],x));
                        visited.insert(x);
                    }
                    if(L[x] != CNT){
                        ok = false;
                    }
                }
                added_colors.insert(col[v]);
            }
            if(p[v] > 0 && !visited.count(p[v])){
                q.insert(mp(-d[p[v]],p[v]));
                visited.insert(p[v]);
            }
        }
        if(ok) {
            ans = min(ans,(int)added_colors.size()-1);
            choosen[cur_col] = 1;
        }
//        cerr << "v = " << v << ", centroid = " << C << "\n";
    }
    f:;
    for(auto& to : g[C]){
        if(!used[to]){
            solve(to,v);
        }
    }
    return;
}

void solve(){
    int n,k;
    cin >> n >> k;

    for(int i = 1; i < n; i++){
        int a,b;
        cin >> a >> b;
        g[a].pb(b);
        g[b].pb(a);
    }

    for(int i = 1; i <= n; i++){
        cin >> col[i];
        cities[col[i]].pb(i);
    }

    solve(1);

    cout << ans << "\n";

    return;
}

signed main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    init();
    int tests = 1;
//    cin >> tests;
    for(int test = 1; test <= tests; test++){
//        cerr << "test = " << test << "\n";
        solve();
    }
    return 0;
}
/**

**/

Compilation message

capital_city.cpp: In function 'void solve(long long int, long long int)':
capital_city.cpp:180:5: warning: label 'f' defined but not used [-Wunused-label]
  180 |     f:;
      |     ^
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 12884 KB Output is correct
2 Correct 8 ms 12884 KB Output is correct
3 Correct 8 ms 12908 KB Output is correct
4 Correct 8 ms 12852 KB Output is correct
5 Correct 8 ms 12884 KB Output is correct
6 Correct 8 ms 12884 KB Output is correct
7 Correct 9 ms 12884 KB Output is correct
8 Correct 8 ms 12884 KB Output is correct
9 Correct 8 ms 12904 KB Output is correct
10 Correct 8 ms 12848 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 12884 KB Output is correct
2 Correct 8 ms 12884 KB Output is correct
3 Correct 8 ms 12908 KB Output is correct
4 Correct 8 ms 12852 KB Output is correct
5 Correct 8 ms 12884 KB Output is correct
6 Correct 8 ms 12884 KB Output is correct
7 Correct 9 ms 12884 KB Output is correct
8 Correct 8 ms 12884 KB Output is correct
9 Correct 8 ms 12904 KB Output is correct
10 Correct 8 ms 12848 KB Output is correct
11 Correct 10 ms 13140 KB Output is correct
12 Correct 11 ms 13248 KB Output is correct
13 Correct 11 ms 13216 KB Output is correct
14 Correct 11 ms 13140 KB Output is correct
15 Correct 11 ms 13012 KB Output is correct
16 Correct 11 ms 13012 KB Output is correct
17 Correct 12 ms 13140 KB Output is correct
18 Incorrect 10 ms 13140 KB Output isn't correct
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 602 ms 36104 KB Output is correct
2 Correct 231 ms 36176 KB Output is correct
3 Correct 605 ms 35868 KB Output is correct
4 Correct 241 ms 36148 KB Output is correct
5 Correct 613 ms 36232 KB Output is correct
6 Correct 234 ms 36428 KB Output is correct
7 Correct 664 ms 37684 KB Output is correct
8 Correct 287 ms 40132 KB Output is correct
9 Execution timed out 3065 ms 40872 KB Time limit exceeded
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 12884 KB Output is correct
2 Correct 8 ms 12884 KB Output is correct
3 Correct 8 ms 12908 KB Output is correct
4 Correct 8 ms 12852 KB Output is correct
5 Correct 8 ms 12884 KB Output is correct
6 Correct 8 ms 12884 KB Output is correct
7 Correct 9 ms 12884 KB Output is correct
8 Correct 8 ms 12884 KB Output is correct
9 Correct 8 ms 12904 KB Output is correct
10 Correct 8 ms 12848 KB Output is correct
11 Correct 10 ms 13140 KB Output is correct
12 Correct 11 ms 13248 KB Output is correct
13 Correct 11 ms 13216 KB Output is correct
14 Correct 11 ms 13140 KB Output is correct
15 Correct 11 ms 13012 KB Output is correct
16 Correct 11 ms 13012 KB Output is correct
17 Correct 12 ms 13140 KB Output is correct
18 Incorrect 10 ms 13140 KB Output isn't correct
19 Halted 0 ms 0 KB -