Submission #1362938

#TimeUsernameProblemLanguageResultExecution timeMemory
1362938ivazivaLove Polygon (BOI18_polygon)C++20
25 / 100
161 ms21632 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 dist[MAXN];
vector<int> nodes[MAXN];
int parent[MAXN];

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

void dfstree(int node,int pret,int depth)
{
    dist[node]=depth;nodes[dist[node]].push_back(node);
    parent[node]=pret;
    for (int sled:adj[node])
    {
        if (sled!=pret) dfstree(sled,node,depth+1);
    }
}

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());
    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;
        loved[v]=true;
    }
    bool subtask2=true;
    for (int i=1;i<=(int)kompresija.size();i++)
    {
        if (!loved[i]) {subtask2=false;break;}
    }
    if (subtask2)
    {
        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);
        }
        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;
    }
    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;
        if (u!=v) {adj[u].push_back(v);adj[v].push_back(u);}
    }
    dfstree(1,0,0);int maxdist=-1;for (int node=1;node<=n;node++) maxdist=max(maxdist,dist[node]);
    int answer=0;
    for (int d=maxdist;d>=1;d--)
    {
        for (int node:nodes[d])
        {
            if (pos[node] or (int)adj[node].size()==1) continue;
            answer++;pos[node]=true;pos[parent[node]]=true;
        }
    }
    cout<<n-answer<<endl;
    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...