제출 #505294

#제출 시각아이디문제언어결과실행 시간메모리
505294wiwihoLove Polygon (BOI18_polygon)C++14
29 / 100
196 ms24148 KiB
#include <bits/stdc++.h>

#define eb emplace_back
#define mp make_pair
#define F first
#define S second
#define printv(a, b) { \
    for(auto pv : a) b << pv << " "; \
    b << "\n"; \
}

using namespace std;

using pii = pair<int, int>;

map<string, int> id;
int num = 1;
int getid(string& s){
    if(id.find(s) == id.end()) id[s] = num++;
    return id[s];
}

int n;
vector<vector<int>> g;
vector<int> dp0, dp1;

void init(){
    g.resize(n + 1);
    dp0.resize(n + 1);
    dp1.resize(n + 1);
}

void dfs(int now){
    int sum = 0, mn = n;
    int cnt = 0;
    for(int i : g[now]){
        if(i == now) continue;
        dfs(i);
        cnt++;
        sum += dp1[i];
        mn = min(mn, dp0[i] - dp1[i]);
    }
    if(cnt == 0){
        dp0[now] = 0; dp1[now] = 1;
    }
    else{
        dp0[now] = sum;
        dp1[now] = sum + mn + 1;
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin >> n;
    init();

    vector<int> f(n + 1);
    for(int i = 1; i <= n; i++){
        string s, t;
        cin >> s >> t;
        int u = getid(s), v = getid(t);
        f[u] = v;
    }
    for(int i = 1; i <= n; i++){
        if(f[f[i]] == i && f[i] != i) continue;
        g[f[i]].eb(i);
    }
    //for(auto& i : id) cerr << i.F << " " << i.S << "\n";

    if(n % 2){
        cout << "-1\n";
        return 0;
    }

    int ans = 0;
    for(int i = 1; i <= n; i++){
        if(f[i] != i) continue;
        dfs(i);
        ans += dp1[i];
    }

    //printv(dp0, cerr);
    //printv(dp1, cerr);

    cout << ans << "\n";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...