Submission #73287

#TimeUsernameProblemLanguageResultExecution timeMemory
73287Sa1378Simurgh (IOI17_simurgh)C++17
51 / 100
218 ms7092 KiB
#include "simurgh.h"
#include <bits/stdc++.h>
using namespace std;
#define N ((int)510)
#define M ((int)151*1000)

int n,m;
pair <int,int> ed[M];
vector <int> e[N],edges,ed_id;
bool ans[M],mark[N];

void dfs(int x,int v)
{
	mark[x]=1;
	for(auto u:e[v])
		if(ed[u].first+ed[u].second-v==x)
		{
			ed_id.push_back(u);
			break;
		}
	for(auto u:e[x])
	{
		int p=ed[u].first+ed[u].second-x;
		if(!mark[p])
		{
			edges.push_back(u);
			dfs(p,v);
		}
	}
}

vector<int> find_roads(int n2,vector<int> u,vector<int> v)
{
	n=n2;m=u.size();
	for(int i=0;i<m;i++)
		ed[i]={v[i],u[i]},
		e[v[i]].push_back(i),
		e[u[i]].push_back(i);
	for(int i=0;i<n-1;i++)
	{
		memset(mark,0,sizeof mark);
		mark[i]=1;
		edges.clear();
		vector <vector <int> > groups;
		for(int j=0;j<n;j++)
			if(!mark[j])
			{
				ed_id.clear();
				dfs(j,i);
				groups.push_back(ed_id);
			}
		for(auto vec:groups)
		{
			vector <int> ex_ed;ex_ed=edges;
			for(auto vec2:groups)
				if(vec!=vec2)
					edges.push_back(vec2[0]);
			vector <int> res;
			for(auto u:vec)
			{
				if(ed[u].first+ed[u].second-i<i)
				{
					res.push_back(N);
					continue;
				}
				edges.push_back(u);
				res.push_back(count_common_roads(edges));
				edges.pop_back();
			}
			int mini=N;
			for(auto u:res)mini=min(mini,u);
			if(mini==N)
			{
				edges=ex_ed;
				continue;
			}
			bool flg=0;
			for(auto u:res)
				if(u==mini+1)
					flg=1;
			if(flg)
			{
				for(int j=0;j<vec.size();j++)
					if(res[j]==mini+1)
						ans[vec[j]]=1;
				edges=ex_ed;
				continue;
			}
			flg=0;
			for(int j=0;j<vec.size();j++)
				if(res[j]==N && ans[vec[j]])
					flg=1;
			if(!flg)
			{
				for(int j=0;j<vec.size();j++)
					if(res[j]!=N)
						ans[vec[j]]=1;
				edges=ex_ed;
				continue;
			}
			for(int j=0;j<vec.size();j++)
				if(res[j]==N && ans[vec[j]])
				{
					edges.push_back(vec[j]);
					int ex=count_common_roads(edges);
					edges.pop_back();
					if(ex==mini)
					{
						for(int k=0;k<vec.size();k++)
							if(res[k]==mini)
								ans[vec[k]]=1;
					}
					break;
				}
			edges=ex_ed;
		}
	}
	vector <int> res;
	for(int i=0;i<m;i++)
		if(ans[i])
			res.push_back(i);
	return res;
}

Compilation message (stderr)

simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:83:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int j=0;j<vec.size();j++)
                 ~^~~~~~~~~~~
simurgh.cpp:90:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int j=0;j<vec.size();j++)
                ~^~~~~~~~~~~
simurgh.cpp:95:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int j=0;j<vec.size();j++)
                 ~^~~~~~~~~~~
simurgh.cpp:101:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int j=0;j<vec.size();j++)
                ~^~~~~~~~~~~
simurgh.cpp:109:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       for(int k=0;k<vec.size();k++)
                   ~^~~~~~~~~~~
#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...