Submission #790680

#TimeUsernameProblemLanguageResultExecution timeMemory
790680ttamxSimurgh (IOI17_simurgh)C++14
13 / 100
16 ms3668 KiB
#include "simurgh.h"
#include<bits/stdc++.h>

using namespace std;

const int N=505;
const int M=15005;

int n,m;
vector<int> adj[N];
vector<int> edge,ans;
int eu[M],ev[M];
bool vis[N],used[M];
int pa[N],pa2[M];
int val[M];

int fp(int u){
	if(pa[u]==u)return u;
	return pa[u]=fp(pa[u]);
}

int fp2(int u){
	if(pa2[u]==u)return u;
	return pa2[u]=fp2(pa2[u]);
}

int go(int u,int i){
	return u^eu[i]^ev[i];
}

bool valid(){
	iota(pa,pa+n,0);
	for(auto i:edge){
		int u=fp(eu[i]),v=fp(ev[i]);
		if(u==v)return false;
		pa[u]=v;
	}
	return true;
}

vector<int> find_roads(int n, vector<int> u, vector<int> v) {
	::n=n;
	m=u.size();
	for(int i=0;i<u.size();i++){
		eu[i]=u[i];
		ev[i]=v[i];
		adj[u[i]].emplace_back(i);
		adj[v[i]].emplace_back(i);
	}
	iota(pa2,pa2+m,0);
	queue<int> q;
	vis[0]=true;
	q.emplace(0);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(auto i:adj[u]){
			int v=go(u,i);
			if(vis[v])continue;
			vis[v]=true;
			q.emplace(v);
			edge.emplace_back(i);
		}
	}
	int res=count_common_roads(edge);
	if(res==n-1)return edge;
	for(auto i:edge)used[i]=true;
	for(int i=0;i<n-1;i++){
		int e=edge[i];
		for(int j=0;j<m;j++){
			if(used[j])continue;
			edge[i]=j;
			if(!valid()){
				edge[i]=e;
				continue;
			}
			int tmp=count_common_roads(edge);
			edge[i]=e;
			if(res==tmp){
				if(fp2(e)!=fp2(j)){
					pa2[fp2(e)]=fp2(j);
					val[fp2(e)]|=val[fp2(j)];
				}
			}else if(tmp>res){
				val[fp2(j)]|=1;
				val[fp2(e)]|=2;
			}else{
				val[fp2(j)]|=2;
				val[fp2(e)]|=1;
			}
		}
	}
	for(int i=0;i<m;i++)if(val[fp2(i)]!=2)ans.emplace_back(i);
	return ans;
}

Compilation message (stderr)

simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:44:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |  for(int i=0;i<u.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...