제출 #1368404

#제출 시각아이디문제언어결과실행 시간메모리
1368404JelaByteEngineerLove Polygon (BOI18_polygon)C++20
25 / 100
219 ms20268 KiB
#include <bits/stdc++.h>
#define ll long long
using namespace std;
vector <vector <int>> g, rg;
vector <bool> ciklus, vis, uparen;
int neupareni=0, ans=0;
void dfs (int st)
{
    vector <int> cik;
    cik.push_back(st);
    int trn=g[st].back();
    while (trn!=st)
    {
        cik.push_back(trn);
        trn=g[trn].back();
    }
    vector <int> duzine;
    int duz=0;
    for (auto i: cik)
    {
        vis[i]=true;
        if (uparen[i])
        {
            duzine.push_back(duz);
            duz=0;
        }
        else duz++;
    }
    if (duzine.size()==0)
    {
        if (cik.size()==2)
        {
            return;
        }
        duzine.push_back(duz);
    }
    else duzine[0]+=duz;
    for (auto i: duzine)
    {
        if (i%2!=0)
        {
            ans+=(i-1)/2;
            neupareni++;
        }
        else ans+=i/2;
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n; cin>>n;
    map <string, int> nomenklatura;
    g.resize(n); rg.resize(n);
    int cntr=0;
    for (int i=0; i<n; i++)
    {
        string s1, s2;
        cin>>s1>>s2;
        if (nomenklatura[s1]==0)
        {
            cntr++;
            nomenklatura[s1]=cntr;
        }
        if (nomenklatura[s2]==0)
        {
            cntr++;
            nomenklatura[s2]=cntr;
        }
        g[nomenklatura[s1]-1].push_back(nomenklatura[s2]-1);
        rg[nomenklatura[s2]-1].push_back(nomenklatura[s1]-1);
    }
    if (n%2!=0) cout<<-1<<endl;
    else
    {
        queue <int> kuku;
        vector <int> cnt(n);
        for (int i=0; i<n; i++)
        {
            cnt[i]=rg[i].size();
            if (rg[i].size()==0)
            {
                kuku.push(i);
            }
        }
        ciklus.assign(n, true);
        uparen.assign(n, false);
        while (!kuku.empty())
        {
            int top=kuku.front();
            ciklus[top]=false;
            kuku.pop();
            for (auto i: g[top])
            {
                if (!uparen[i] && !uparen[top] && i!=top && g[g[i].back()].back()!=i)
                {
                    uparen[top]=true;
                    uparen[i]=true;
                }
                cnt[i]--;
                if (cnt[i]==0)
                {
                    kuku.push(i);
                }
            }
        }
        int upareni=0;
        for (int i=0; i<n; i++)
        {
            if (uparen[i]) upareni++;
            else if (!ciklus[i]) neupareni++;
        }
        ans+=upareni/2;
        vis.assign(n, false);
        for (int i=0; i<n; i++)
        {
            if (ciklus[i] && !vis[i])
            {
                dfs(i);
            }
        }
        ans+=neupareni;
        cout<<ans<<endl;
    }
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…