Submission #1298581

#TimeUsernameProblemLanguageResultExecution timeMemory
1298581HuyATLove Polygon (BOI18_polygon)C++20
29 / 100
156 ms21516 KiB
#include<bits/stdc++.h>
#define newl '\n'

const int N = 1e5 + 10;
const int V = 1e7 + 10;
const long long INF = 1e18;
const long long M = 1e9 + 7;

struct Solver{
    int n,id;
    std::vector<bool> match;
    std::vector<std::vector<int>> adj;
    std::map<std::string,int> m;
    std::vector<int> par,vis;
    int get(std::string str){
        if(m[str] == 0){
            m[str] = ++id;
        }
        return m[str];
    }
    Solver() : id(0){

    }
    void readData(){
        std::cin >> n;
        adj.resize(n + 1);
        par.assign(n + 1,0);
        vis.assign(n + 1,0);
        match.assign(n + 1,0);
        for(int i = 1;i <= n;++i){
            std::string su,sv;
            std::cin >> su >> sv;
            int u = get(su);
            int v = get(sv);
            par[u] = v;
            adj[par[u]].emplace_back(u);
//            std::cout << u << " " << v << newl;
        }
    }
    void dfs(int u){
        vis[u] = true;
        for(int v : adj[u]){
            if(vis[v] || v == u){
                continue;
            }
            dfs(v);
            if(!match[v] && !match[u]){
                match[u] = match[v] = true;
            }
        }
    }
    void solve(){
        if(n & 1){
            std::cout << -1;
            return;
        }
        for(int i = 1;i <= n;++i){
            if(i == par[i]){
                dfs(i);
            }
        }
        int ans = 0;
        for(int i = 1;i <= n;++i){
            ans += match[i];
//            std::cout << match[i] << " ";
        }
        ans /= 2;
        for(int i = 1;i <= n;++i){
            ans += !match[i];
//            std::cout << match[i] << " ";
        }
//        for(int i = 1;i <= n;++i){
//            ans -= (par[par[i]] == i && i < par[i]);
//        }
        std::cout << ans;
    }
    void main(){
        readData();
        solve();
    }
};
int main(){
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);std::cout.tie(nullptr);
    Solver().main();
    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...