Submission #283350

#TimeUsernameProblemLanguageResultExecution timeMemory
283350MKopchevSimurgh (IOI17_simurgh)C++14
51 / 100
280 ms5788 KiB
#include "simurgh.h"
#include<bits/stdc++.h>
using namespace std;

const int nmax=500+42;
/*
int count_common_roads(vector<int> r)
{
    for(auto k:r)cout<<k<<" ";

    cout<<" -> ";

    int ret=0;

    for(auto k:r)
        if(k==0||k==1||k==5)ret++;
        //if(k==0||k==1||k==3)ret++;

    //cin>>ret;

    cout<<"ret= "<<ret<<endl;

    while(r.size()!=3)
    {
        while(1);
    }

    return ret;
}
*/
int type[nmax*nmax];//-1-> unknown, 0-> not special, 1-> special

int parent[nmax];
int root(int node)
{
    if(parent[node]==node)return node;
    parent[node]=root(parent[node]);
    return parent[node];
}

void init(int n_)
{
    for(int i=0;i<n_;i++)
        parent[i]=i;
}

vector< pair<int/*to*/,int/*id*/> > adj[nmax];

int is_forced[nmax*nmax];

vector<int> forced={};

vector< pair<int,int> > edges;

int my_n;

void dumb(int node)
{
    //cout<<"dumb "<<node<<endl;

    //for(int i=0;i<edges.size();i++)cout<<type[i]<<" ";cout<<endl;

    init(my_n);

    vector<int> cur_r=forced,to_solve={};

    for(auto k:forced)
        parent[root(edges[k].first)]=root(edges[k].second);

    int important=-1;

    for(auto k:adj[node])
        if(is_forced[k.second]==0&&type[k.second]!=-1)important=k.second;
        else if(type[k.second]==-1)to_solve.push_back(k.second);

    if(to_solve.size()==0)return;

    vector<int> to_run={};

    if(important!=-1)
    {
        for(int i=0;i<edges.size();i++)
            if(edges[i].first!=node&&edges[i].second!=node&&root(edges[i].first)!=root(edges[i].second))
            {
                parent[root(edges[i].first)]=root(edges[i].second);

                cur_r.push_back(i);
            }

        cur_r.push_back(important);

        int with=count_common_roads(cur_r);

        cur_r.pop_back();

        for(auto k:adj[node])
            if(type[k.second]==-1)
            {
                cur_r.push_back(k.second);

                int cur=count_common_roads(cur_r);

                cur_r.pop_back();

                type[k.second]=cur-with+type[important];

                to_run.push_back(k.first);
            }
    }
    else
    {
        for(int i=0;i<edges.size();i++)
            if(edges[i].first!=node&&edges[i].second!=node&&root(edges[i].first)!=root(edges[i].second))
            {
                parent[root(edges[i].first)]=root(edges[i].second);

                cur_r.push_back(i);

                //cout<<"push "<<i<<endl;
            }
        //cout<<"---"<<endl;

        vector<int> mem={},with={};

        for(auto k:adj[node])
            if(type[k.second]==-1)
            {
                //cout<<"k= "<<k.second<<endl;

                with.push_back(k.second);

                cur_r.push_back(k.second);

                mem.push_back(count_common_roads(cur_r));

                cur_r.pop_back();
            }

        int mini=mem[0],maxi=mem[0];

        for(auto k:mem)
        {
            mini=min(mini,k);
            maxi=max(maxi,k);
        }

        if(mini!=maxi)//mini=maxi => all are equal
        {
            for(int i=0;i<mem.size();i++)
            {
                to_run.push_back(adj[node][i].first);

                type[with[i]]=mem[i]-mini;
            }
        }

    }

    for(auto k:to_run)
        dumb(k);
}
std::vector<int> find_roads(int n, std::vector<int> u, std::vector<int> v)
{
    my_n=n;

    for(int i=0;i<u.size();i++)
        edges.push_back({u[i],v[i]});

    memset(type,-1,sizeof(type));

    vector<int> to_test={};

    init(n);

    for(int i=0;i<u.size();i++)
    {
        if(root(u[i])!=root(v[i]))
        {
            to_test.push_back(i);
            parent[root(u[i])]=root(v[i]);
        }

        adj[u[i]].push_back({v[i],i});
        adj[v[i]].push_back({u[i],i});
    }

    for(auto cur:to_test)
    {
        init(n);

        for(int i=0;i<u.size()&&root(u[cur])!=root(v[cur]);i++)
            if(root(u[i])!=root(v[i])&&i!=cur)
                parent[root(u[i])]=root(v[i]);

        if(root(u[cur])!=root(v[cur]))
        {
            type[cur]=1;
            forced.push_back(cur);
            is_forced[cur]=1;

            //cout<<"forced "<<cur<<endl;
        }
    }

    for(int i=0;i<n;i++)dumb(i);

    vector<int> ret={};

    for(int i=0;i<edges.size();i++)
        if(type[i]==1)ret.push_back(i);

    return ret;
}

Compilation message (stderr)

simurgh.cpp: In function 'void dumb(int)':
simurgh.cpp:82:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |         for(int i=0;i<edges.size();i++)
      |                     ~^~~~~~~~~~~~~
simurgh.cpp:112:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |         for(int i=0;i<edges.size();i++)
      |                     ~^~~~~~~~~~~~~
simurgh.cpp:149:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  149 |             for(int i=0;i<mem.size();i++)
      |                         ~^~~~~~~~~~~
simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:166:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  166 |     for(int i=0;i<u.size();i++)
      |                 ~^~~~~~~~~
simurgh.cpp:175:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  175 |     for(int i=0;i<u.size();i++)
      |                 ~^~~~~~~~~
simurgh.cpp:191:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  191 |         for(int i=0;i<u.size()&&root(u[cur])!=root(v[cur]);i++)
      |                     ~^~~~~~~~~
simurgh.cpp:209:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  209 |     for(int i=0;i<edges.size();i++)
      |                 ~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...