답안 #1101571

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1101571 2024-10-16T10:54:35 Z MMihalev Simurgh (IOI17_simurgh) C++14
컴파일 오류
0 ms 0 KB
#include<iostream>
#include<algorithm>
#include<set>
#include<queue>
#include "simurgh.h"
using namespace std;
const int MAX_N=5e2+3;
const int MAX_M=125000;
int n,m;
int q;
vector<int>edges;
vector<pair<int,int>>g[MAX_N];
bool used[MAX_N];
vector<int>comp;
vector<vector<int>>comps;
int adj[MAX_N];
int numedge[MAX_N][MAX_N];

bool stat[MAX_M];
bool checked[MAX_M];
int forsure;


bool mm[MAX_N];
bool uu[MAX_N];
int pre[MAX_N];
void reset()
{
    comps.clear();
    edges.clear();
    for(int i=0;i<n;i++)
    {
        adj[i]=-1;
        used[i]=0;
    }
}
void dfs(int u)
{
    if(adj[u]!=-1)
    {
        if(!checked[adj[u]])
        {
            comp.push_back(adj[u]);
        }
        if(stat[adj[u]])forsure=adj[u];
    }
    used[u]=1;
    for(auto [v,edge]:g[u])
    {
        if(used[v])continue;
        edges.push_back(edge);
        dfs(v);
    }
}
void rep(int prev,int edge)
{
    for(int i=0;i<edges.size();i++)
    {
        if(edges[i]==prev){edges[i]=edge;return;}
    }
}
vector<pair<int,int>>s;
int rec(int l,int r)
{
    if(l==r)
    {
        return s[l].first;
    }

    int mid=(l+r)/2;

    int bonus=0;
    edges.clear();
    for(int i=0;i<n;i++)used[i]=0;

    for(int i=l;i<=mid;i++)
    {
        edges.push_back(s[i].first);
        used[s[i].second]=1;
    }

    for(int i=1;i<n;i++)
    {
        if(!used[i]){bonus+=stat[numedge[0][i]];edges.push_back(numedge[0][i]);}
    }

    int cnt=count_common_roads(edges)-bonus;q++;

    if(cnt>0)return rec(l,mid);
    return rec(mid+1,r);
}
vector<int> find_roads(int N, vector<int> u, vector<int> v)
{
    n=N;
    m=u.size();

    vector<int>ans;
    for(int i=0;i<m;i++)
    {
        g[u[i]].push_back({v[i],i});
        g[v[i]].push_back({u[i],i});
        numedge[u[i]][v[i]]=i;
        numedge[v[i]][u[i]]=i;
    }

    set<pair<int,int>>so;
    for(int i=0;i<n;i++)
    {
        so.insert({g[i].size(),i});
        pre[i]=g[i].size();
    }

    int cc=0;
    while(so.size())
    {
        auto f=(*(so.rbegin()));
        so.erase(f);
        int u=f.second;

        cc++;
        mm[u]=1;
        for(auto [v,edge]:g[u])uu[v]=1;

        for(int i=0;i<n;i++)
        {
            if(mm[i])continue;
            int npre=0;
            for(auto [v,edge]:g[i])
            {
                if(uu[v] or mm[v])continue;

                npre++;
            }
            so.erase({i,pre[i]});
            pre[i]=npre;
            s.insert({i,pre[i]});
        }

        bool bad=0;
        for(int i=0;i<n;i++)
        {
            if(mm[i])continue;
            if(uu[i])continue;
            bad=1;
            break;
        }
        if(bad==0)
        {
            if(cc>100)while(1);
            break;
        }
    }



    if(m!=n*(n-1)/2)
    {
        for(int u=0;u<n;u++)
        {
            reset();
            used[u]=1;
            for(auto [v,edge]:g[u])
            {
                adj[v]=edge;
            }
            for(auto [v,edge]:g[u])
            {
                if(!used[v])
                {
                    forsure=-1;
                    comp.clear();
                    dfs(v);
                    if(forsure!=-1)
                    {
                        comp.push_back(forsure);
                    }
                    comps.push_back(comp);
                }
            }

            for(auto c:comps)
            {
                edges.push_back(c[0]);
            }

            for(auto c:comps)
            {
                int ma=count_common_roads(edges);q++;
                vector<int>marked;
                marked.push_back(c[0]);
                int prev=c[0];
                int sega=0;

                for(int edge:c)
                {
                    if(edge==c[0])continue;

                    rep(prev,edge);

                    int cur=count_common_roads(edges);q++;
                    if(cur>ma)
                    {
                        sega++;
                        marked.clear();
                        ma=cur;
                        marked.push_back(edge);
                        if(sega==2)break;
                    }
                    else if(cur==ma)
                    {
                        marked.push_back(edge);
                    }

                    prev=edge;
                }

                for(int edge:marked)stat[edge]=1;
            }

            for(auto [v,edge]:g[u])checked[edge]=1;
        }

    }
    else
    {
        for(int u=0;u<n;u++)
        {
            if(u==0)
            {
                vector<int>marked;
                edges.clear();
                for(int v=2;v<n;v++)
                {
                    edges.push_back(numedge[v-1][v]);
                }

                int ma=-1;

                for(auto [v,edge]:g[u])
                {
                    edges.push_back(edge);
                    int cur=count_common_roads(edges);q++;
                    edges.pop_back();

                    if(cur>ma)
                    {
                        marked.clear();
                        marked.push_back(edge);
                        ma=cur;
                    }
                    else if(cur==ma)marked.push_back(edge);
                }

                for(int edge:marked)stat[edge]=1;

                continue;
            }


            while(1)
            {
                int bonus=0;
                edges.clear();
                s.clear();
                for(int i=0;i<n;i++)used[i]=0;

                for(auto [v,edge]:g[u])
                {
                    if(stat[edge] or v==0)continue;
                    edges.push_back(edge);
                    s.push_back({edge,v});
                    used[v]=1;
                }

                for(int i=1;i<n;i++)
                {
                    if(!used[i]){bonus+=stat[numedge[0][i]];edges.push_back(numedge[0][i]);}
                }

                int cur=count_common_roads(edges)-bonus;q++;

                if(cur==0)break;

                int edge=rec(0,s.size()-1);
                stat[edge]=1;
            }
        }

        if(q>6000)while(1);
    }

    for(int i=0;i<m;i++)
    {
        if(stat[i])ans.push_back(i);
    }

    return ans;
}

Compilation message

simurgh.cpp: In function 'void dfs(int)':
simurgh.cpp:48:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   48 |     for(auto [v,edge]:g[u])
      |              ^
simurgh.cpp: In function 'void rep(int, int)':
simurgh.cpp:57:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |     for(int i=0;i<edges.size();i++)
      |                 ~^~~~~~~~~~~~~
simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:122:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  122 |         for(auto [v,edge]:g[u])uu[v]=1;
      |                  ^
simurgh.cpp:128:22: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  128 |             for(auto [v,edge]:g[i])
      |                      ^
simurgh.cpp:136:32: error: no matching function for call to 'std::vector<std::pair<int, int> >::insert(<brace-enclosed initializer list>)'
  136 |             s.insert({i,pre[i]});
      |                                ^
In file included from /usr/include/c++/10/vector:72,
                 from /usr/include/c++/10/queue:61,
                 from simurgh.cpp:4:
/usr/include/c++/10/bits/vector.tcc:130:5: note: candidate: 'std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::insert(std::vector<_Tp, _Alloc>::const_iterator, const value_type&) [with _Tp = std::pair<int, int>; _Alloc = std::allocator<std::pair<int, int> >; std::vector<_Tp, _Alloc>::iterator = std::vector<std::pair<int, int> >::iterator; std::vector<_Tp, _Alloc>::const_iterator = std::vector<std::pair<int, int> >::const_iterator; std::vector<_Tp, _Alloc>::value_type = std::pair<int, int>]'
  130 |     vector<_Tp, _Alloc>::
      |     ^~~~~~~~~~~~~~~~~~~
/usr/include/c++/10/bits/vector.tcc:130:5: note:   candidate expects 2 arguments, 1 provided
In file included from /usr/include/c++/10/vector:67,
                 from /usr/include/c++/10/queue:61,
                 from simurgh.cpp:4:
/usr/include/c++/10/bits/stl_vector.h:1293:7: note: candidate: 'std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::insert(std::vector<_Tp, _Alloc>::const_iterator, std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = std::pair<int, int>; _Alloc = std::allocator<std::pair<int, int> >; std::vector<_Tp, _Alloc>::iterator = std::vector<std::pair<int, int> >::iterator; std::vector<_Tp, _Alloc>::const_iterator = std::vector<std::pair<int, int> >::const_iterator; std::vector<_Tp, _Alloc>::value_type = std::pair<int, int>]'
 1293 |       insert(const_iterator __position, value_type&& __x)
      |       ^~~~~~
/usr/include/c++/10/bits/stl_vector.h:1293:7: note:   candidate expects 2 arguments, 1 provided
/usr/include/c++/10/bits/stl_vector.h:1310:7: note: candidate: 'std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::insert(std::vector<_Tp, _Alloc>::const_iterator, std::initializer_list<_Tp>) [with _Tp = std::pair<int, int>; _Alloc = std::allocator<std::pair<int, int> >; std::vector<_Tp, _Alloc>::iterator = std::vector<std::pair<int, int> >::iterator; std::vector<_Tp, _Alloc>::const_iterator = std::vector<std::pair<int, int> >::const_iterator]'
 1310 |       insert(const_iterator __position, initializer_list<value_type> __l)
      |       ^~~~~~
/usr/include/c++/10/bits/stl_vector.h:1310:7: note:   candidate expects 2 arguments, 1 provided
/usr/include/c++/10/bits/stl_vector.h:1335:7: note: candidate: 'std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::insert(std::vector<_Tp, _Alloc>::const_iterator, std::vector<_Tp, _Alloc>::size_type, const value_type&) [with _Tp = std::pair<int, int>; _Alloc = std::allocator<std::pair<int, int> >; std::vector<_Tp, _Alloc>::iterator = std::vector<std::pair<int, int> >::iterator; std::vector<_Tp, _Alloc>::const_iterator = std::vector<std::pair<int, int> >::const_iterator; std::vector<_Tp, _Alloc>::size_type = long unsigned int; std::vector<_Tp, _Alloc>::value_type = std::pair<int, int>]'
 1335 |       insert(const_iterator __position, size_type __n, const value_type& __x)
      |       ^~~~~~
/usr/include/c++/10/bits/stl_vector.h:1335:7: note:   candidate expects 3 arguments, 1 provided
/usr/include/c++/10/bits/stl_vector.h:1379:2: note: candidate: 'template<class _InputIterator, class> std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::insert(std::vector<_Tp, _Alloc>::const_iterator, _InputIterator, _InputIterator) [with _InputIterator = _InputIterator; <template-parameter-2-2> = <template-parameter-1-2>; _Tp = std::pair<int, int>; _Alloc = std::allocator<std::pair<int, int> >]'
 1379 |  insert(const_iterator __position, _InputIterator __first,
      |  ^~~~~~
/usr/include/c++/10/bits/stl_vector.h:1379:2: note:   template argument deduction/substitution failed:
simurgh.cpp:136:32: note:   candidate expects 3 arguments, 1 provided
  136 |             s.insert({i,pre[i]});
      |                                ^
simurgh.cpp:162:22: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  162 |             for(auto [v,edge]:g[u])
      |                      ^
simurgh.cpp:166:22: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  166 |             for(auto [v,edge]:g[u])
      |                      ^
simurgh.cpp:220:22: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  220 |             for(auto [v,edge]:g[u])checked[edge]=1;
      |                      ^
simurgh.cpp:239:26: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  239 |                 for(auto [v,edge]:g[u])
      |                          ^
simurgh.cpp:267:26: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  267 |                 for(auto [v,edge]:g[u])
      |                          ^