제출 #637823

#제출 시각아이디문제언어결과실행 시간메모리
637823Cross_Ratio수도 (JOI20_capital_city)C++14
30 / 100
275 ms30604 KiB
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> adj;
int C[200005];
int ma[200005];
int mi[200005];
int A[200005];
int B[200005];
bool vis[200005];
int DnC(int s, int e, set<int> Col) {
    //cout << "DnC : " << s << ' ' << e << '\n';
    if(Col.size()==0 || e<=s) return 1e9;
    if(s+1==e && Col.find(B[s])!=Col.end()) return 0;
    //cout << "Possible Colors : ";
    //for(int n : Col) cout << n << ' ';
    //cout << '\n';
    int mid = (s+e)/2;
    int l = mid, r = mid;
    int pm = mi[B[mid]], pa = ma[B[mid]];
    int val = 1e9;
    if(Col.find(B[mid])!=Col.end()) {
        set<int> S;
        S.insert(B[mid]);
        bool isPos = true;
        while(pm < l || r < pa) {
            while(pm < l) {
                l--;
                if(Col.find(B[l])==Col.end()) {
                    isPos = false;
                    break;
                }
                S.insert(B[l]);
                pm = min(pm, mi[B[l]]);
                pa = max(pa, ma[B[l]]);
            }
            if(!isPos) break;
            while(r < pa) {
                r++;
                if(Col.find(B[r])==Col.end()) {
                    isPos = false;
                    break;
                }
                S.insert(B[r]);
                pm = min(pm, mi[B[r]]);
                pa = max(pa, ma[B[r]]);
            }
            if(!isPos) break;
        }
        if(isPos) val = min(val, (int)S.size()-1);
    }
    set<int> S1, S2;
    for(int n : Col) {
        if(s<=mi[n]&&ma[n]<mid) S1.insert(n);
        if(mid<mi[n]&&ma[n]<e) S2.insert(n);
    }
    //cout << val << '\n';
    val = min(val, DnC(s, mid, S1));
    val = min(val, DnC(mid+1, e, S2));
    //cout << s << " to " << e << " : " << val <<'\n';
    return val;
}
signed main() {
    cin.sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int N, K;
    cin >> N >> K;
    int i, j;
    adj.resize(N);
    for(i=0;i<N-1;i++) {
        int a, b;
        cin >> a >> b;
        adj[a-1].push_back(b-1);
        adj[b-1].push_back(a-1);
    }
    int l = 0;
    vis[l] = true;
    while(true) {
        for(int n : adj[l]) {
            if(!vis[n]) {
                l = n;
                break;
            }
        }
        if(vis[l]) break;
        vis[l] = true;
    }
    for(i=0;i<N;i++) vis[i] = false;
    int cnt = 0;
    while(cnt < N) {
        A[cnt] = l;
        cnt++;
        vis[l] = true;
        for(int n : adj[l]) {
            if(!vis[n]) {
                l = n;
                break;
            }
        }
    }
    for(i=0;i<K;i++) {
        ma[i] = -1;
        mi[i] = N;
    }
    for(i=0;i<N;i++) {
        cin >> C[i];
        C[i]--;
    }
    for(i=0;i<N;i++) B[i] = C[A[i]];
    /*for(i=0;i<N;i++) cout << A[i] << ' ';
    cout <<'\n';
    for(i=0;i<N;i++) cout << B[i] << ' ';
    cout << '\n';*/
    for(i=0;i<N;i++) {
        ma[B[i]] = max(ma[B[i]], i);
        mi[B[i]] = min(mi[B[i]], i);
    }
    for(i=0;i<K;i++) {
        if(ma[i]==mi[i]) {
            cout << "0";
            return 0;
        }
    }
    set<int> col;
    for(i=0;i<K;i++) col.insert(i);
    cout << DnC(0, N, col);
}

컴파일 시 표준 에러 (stderr) 메시지

capital_city.cpp: In function 'int main()':
capital_city.cpp:68:12: warning: unused variable 'j' [-Wunused-variable]
   68 |     int i, j;
      |            ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...