Submission #1361911

#TimeUsernameProblemLanguageResultExecution timeMemory
1361911ivazivaLove Polygon (BOI18_polygon)C++20
0 / 100
1090 ms11144 KiB
#include <bits/stdc++.h>

using namespace std;

#define MAXN 100001
#define int long long

int n;
set<pair<string,string>> edges;
vector<pair<string,string>> for_delete;
vector<pair<string,string>> newedges;
vector<string> vec;

int32_t main()
{
    cin>>n;for (int i=1;i<=n;i++) {string s1,s2;cin>>s1>>s2;edges.insert({s1,s2});}
    if (n%2==1) {cout<<-1<<endl;return 0;}
    for (pair<string,string> edge:edges)
    {
        string ime1=edge.first,ime2=edge.second;
        if (edges.find({ime2,ime1})!=edges.end() and ime1!=ime2) for_delete.push_back({ime1,ime2});
    }
    for (pair<string,string> edge:for_delete) edges.erase({edge.first,edge.second});
    if (n<=20)
    {
        for (pair<string,string> edge:edges) newedges.push_back({edge.first,edge.second});
        n=(int)newedges.size();int answer=n+1;
        for (int maska=0;maska<(1<<n);maska++)
        {
            for (int bit=0;bit<n;bit++)
            {
                if (maska&(1<<bit)) {vec.push_back(newedges[bit].first);vec.push_back(newedges[bit].second);}
            }
            sort(vec.begin(),vec.end());bool valid=true;
            for (int i=1;i<(int)vec.size();i++)
            {
                if (vec[i-1]==vec[i]) {valid=false;break;}
            }
            if (valid) answer=min(answer,n-(int)__builtin_popcount(maska));
            vec.clear();
        }
        cout<<answer<<endl;return 0;
    }
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...