| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 862330 | guagua0407 | Love Polygon (BOI18_polygon) | C++17 | 233 ms | 22776 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
//#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define f first
#define s second
#define all(x) x.begin(),x.end()
#define _ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
void setIO(string s) {
    freopen((s + ".in").c_str(), "r", stdin);
    freopen((s + ".out").c_str(), "w", stdout);
}
const int mxn=1e5+5;
map<string,int> mp;
vector<int> adj[mxn];
bool visited[mxn];
bool visited2[mxn];
int nxt[mxn];
bool is_cycle[mxn];
bool used[mxn];
int prv[mxn];
vector<int> tmp;
int dif;
void dfs(int v){
    visited[v]=true;
    for(auto u:adj[v]){
        if(is_cycle[u]) continue;
        dfs(u);
        if(!used[u] and !used[v]){
            used[u]=true;
            used[v]=true;
        }
    }
}
int main() {_
    int n;
    cin>>n;
    if(n&1){
        cout<<-1<<'\n';
        return 0;
    }
    int cnt=0;
    for(int i=0;i<n;i++){
        string a,b;
        cin>>a>>b;
        if(!mp.count(a)) mp[a]=cnt++;
        if(!mp.count(b)) mp[b]=cnt++;
        nxt[mp[a]]=mp[b];
        adj[mp[b]].push_back(mp[a]);
    }
    for(int i=0;i<n;i++){
        if(visited[i]) continue;
        vector<int> vec;
        int cur=i;
        while(!visited[cur]){
            vec.push_back(cur);
            visited[cur]=true;
            cur=nxt[cur];
        }
        vector<int> cycle;
        reverse(all(vec));
        for(auto v:vec){
            is_cycle[v]=true;
            cycle.push_back(v);
            if(v==cur){
                break;
            }
        }
        for(auto v:cycle){
            dfs(v);
            if((int)cycle.size()==2 and used[v]){
                for(auto u:adj[v]){
                    if(used[u]){
                        used[u]=used[v]=false;
                        break;
                    }
                }
            }
        }
        int cur2=cur;
        do{
            if(used[cur2]) break;
            cur2=nxt[cur2];
        }while(cur2!=cur);
        int cur3=cur2;
        vector<int> tmp2;
        do{
            if(used[cur3]){
                for(auto v:tmp2){
                    used[v]=true;
                }
                if((int)tmp2.size()%2==1){
                    used[tmp2.back()]=false;
                }
                tmp2.clear();
            }
            else{
                tmp2.push_back(cur3);
            }
            cur3=nxt[cur3];
        }while(cur3!=cur2);
        if((int)cycle.size()==2 and (int)tmp2.size()==2){
            dif++;
        }
        for(auto v:tmp2){
            used[v]=true;
        }
        if((int)tmp2.size()%2==1){
            used[tmp2.back()]=false;
        }
        tmp2.clear();
    }
    int cnt2=0;
    for(int i=0;i<n;i++){
        //cout<<used[i]<<' ';
        if(used[i]) cnt2++;
    }
    //cout<<'\n';
    cout<<(cnt2/2+n-cnt2-dif)<<'\n';
    return 0;
}
//maybe its multiset not set
컴파일 시 표준 에러 (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... | ||||
