| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 977246 | Isam | Love Polygon (BOI18_polygon) | C++17 | 2101 ms | 33380 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
#define eb emplace_back
#define all(x) begin(x),end(x)
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
constexpr int sz = 1e5 + 5;
int n, tot, degree[sz];
string s1, s2;
unordered_map<string, int> mp;
unordered_map<int, bool> g[sz];
int k, ansl;
vector<int> st;
bool vis[sz], mekni[sz], mki[sz];
bool cmp(int c, int d){
return degree[c] < degree[d];
}
int solv(){
shuffle(all(st), rng);
int ans(0);
set<int> obino;
for(register int i = 1; i <= n; ++i){
mekni[i] = mki[i];
vis[i] = mki[i];
}
register int j(0);
while(j < (int)st.size()){
if(mekni[st[j]]){
++j;
continue;
}
int u = st[j], v = -1;
for(auto &to : g[u]){
if(vis[to.first] || to.second == false) continue;
v = to.first;
break;
}
if(v == -1){
obino.insert(u);
mekni[u] = 1;
continue;
}
vis[v] = 1;
mekni[v] = 1;
vis[u] = 1;
++ans;
}
int t(0);
for(auto &to : obino){
if(vis[to]) continue;
++t;
}
ans += t;
return ans;
}
signed main(){
ios_base::sync_with_stdio(0), cin.tie(0);
cin >> n;
for(register int i = 1; i <= n; ++i) st.eb(i);
for(register int i = 1; i <= n; ++i){
cin >> s1 >> s2;
if(mp[s1] == 0) mp[s1] = ++tot;
if(mp[s2] == 0) mp[s2] = ++tot;
int u = mp[s1], v = mp[s2];
if(u == v) continue;
degree[u]++, degree[v]++;
g[u][v] = 1;
if(g[v][u] == 1) ++k, mki[v] = mki[u] = mekni[v] = mekni[u] = vis[v] = vis[u] = 1;
}
int ans(0);
sort(all(st), cmp);
mp.clear();
if(n & 1) return cout << -1 << '\n', 0;
if(k == n/2) return cout << 0 << '\n', 0;
set<int> obino;
register int j(0);
while(j < (int)st.size()){
if(mekni[st[j]]){
++j;
continue;
}
int u = st[j], v = -1;
for(auto &to : g[u]){
if(vis[to.first] || to.second == false) continue;
v = to.first;
break;
}
if(v == -1){
obino.insert(u);
mekni[u] = 1;
continue;
}
vis[v] = 1;
mekni[v] = 1;
vis[u] = 1;
++ans;
}
int t(0);
for(auto &to : obino){
if(vis[to]) continue;
++t;
}
ans += t;
int cnt = 50;
while(cnt--) ans = min(ans, solv());
cout << ans << '\n';
return 0;
}
/*
1 2 +1
2 6
6 3
3 2
4 5
*/컴파일 시 표준 에러 (stderr) 메시지
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
