제출 #1298612

#제출 시각아이디문제언어결과실행 시간메모리
1298612HuyATLove Polygon (BOI18_polygon)C++20
0 / 100
224 ms15340 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 Subtask{ // 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]; // } // Subtask() : 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(); // } //}; struct Solver{ int n,id,ans = 0; std::vector<bool> match; std::vector<std::vector<int>> adj; std::map<std::string,int> m; std::vector<int> par,vis,deg; int get(std::string str){ if(m[str] == 0){ m[str] = ++id; } return m[str]; } Solver() : id(0){ } void readData(){ std::cin >> n; match.assign(n + 1,0); adj.resize(n + 1); par.assign(n + 1,0); vis.assign(n + 1,0); deg.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); ++deg[par[u]]; std::cout << u << " " << v << newl; } } void prepare(){ std::queue<int> q; for(int i = 1;i <= n;++i){ if(deg[i] == 0){ q.push(i); } } while(!q.empty()){ int u = q.front(); q.pop(); for(int v : adj[u]){ --deg[v]; if(deg[v] == 0){ q.push(v); } } } } 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; ++ans; } } } void dfs1(int u){ vis[u] = true; for(int v : adj[u]){ if(vis[v] || v == u || deg[v] > 0){ continue; } dfs(v); if(!match[v] && !match[u]){ match[u] = match[v] = true; ++ans; } } } void dfs_cycle(int u){ vis[u] = true; for(int v : adj[u]){ if(vis[v] || v == u || deg[v] == 0){ continue; } dfs(v); if(!match[v] && !match[u]){ match[u] = match[v] = true; ++ans; } } } void solve(){ for(int i = 1;i <= n;++i){ if(par[i] == i){ dfs(i); }else{ if(par[par[i]] == i){ if(par[i] > i){ match[i] = match[par[i]] = true; } dfs(i); dfs(par[i]); }else{ dfs1(i); } } } std::fill(vis.begin() + 1,vis.end(),0); for(int i = 1;i <= n;++i){ if(deg[i] > 0 && !vis[i]){ dfs_cycle(i); } } for(int i = 1;i <= n;++i){ // std::cout << match[i] << " "; ans += !match[i]; } std::cout << ans; } void main(){ readData(); prepare(); 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...