제출 #1362980

#제출 시각아이디문제언어결과실행 시간메모리
1362980ivazivaLove Polygon (BOI18_polygon)C++20
46 / 100
374 ms21620 KiB
#include <bits/stdc++.h>

using namespace std;

#define MAXN 200001
#define int long long

int n;
vector<pair<string,string>> edges;
vector<string> kompresija;
bool loved[MAXN];
vector<int> adj[MAXN];
bool pos[MAXN];
int siz=0;
int in[MAXN],out[MAXN];

void dfs(int node)
{
    pos[node]=true;siz++;
    for (int sled:adj[node])
    {
        if (!pos[sled]) dfs(sled);
    }
}

int32_t main()
{
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        string s1,s2;cin>>s1>>s2;edges.push_back({s1,s2});
        kompresija.push_back(s1);kompresija.push_back(s2);
    }
    if (n%2==1) {cout<<-1<<endl;return 0;}
    sort(kompresija.begin(),kompresija.end());kompresija.erase(unique(kompresija.begin(),kompresija.end()),kompresija.end());
    if (n<=20)
    {
        int answer=n;
        for (int maska=0;maska<(1<<n);maska++)
        {
            bool valid=true;
            for (int bit=0;bit<n;bit++)
            {
                if (!(maska&(1<<bit))) continue;
                int u=lower_bound(kompresija.begin(),kompresija.end(),edges[bit].first)-kompresija.begin()+1;
                int v=lower_bound(kompresija.begin(),kompresija.end(),edges[bit].second)-kompresija.begin()+1;
                in[v]++;out[u]++;adj[u].push_back(v);
                if (u==v) valid=false;
            }
            for (int node=1;node<=n;node++)
            {
                if (in[node]>=2 or out[node]>=2) {valid=false;break;}
                if (in[node]==1 and out[node]==1)
                {
                    if ((int)adj[adj[node][0]].size()!=1) {valid=false;break;}
                    if ((int)adj[adj[node][0]][0]!=node) {valid=false;break;}
                }
            }
            if (valid) answer=min(answer,n-(int)__builtin_popcount(maska));
            for (int node=1;node<=n;node++) {in[node]=0;out[node]=0;adj[node].clear();}
        }
        cout<<answer<<endl;return 0;
    }
    for (pair<string,string> edge:edges)
    {
        int u=lower_bound(kompresija.begin(),kompresija.end(),edge.first)-kompresija.begin()+1;
        int v=lower_bound(kompresija.begin(),kompresija.end(),edge.second)-kompresija.begin()+1;
        adj[u].push_back(v);loved[v]=true;
    }
    bool subtask2=true;
    for (int i=1;i<=(int)kompresija.size();i++)
    {
        if (!loved[i]) {subtask2=false;break;}
    }
    if (subtask2)
    {
        int answer=0;
        for (int node=1;node<=(int)kompresija.size();node++)
        {
            if (pos[node]) continue;
            siz=0;dfs(node);if (siz==2) continue;
            answer+=(siz+1)/2;
        }
        cout<<answer<<endl;return 0;
    }
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…