Submission #1201710

#TimeUsernameProblemLanguageResultExecution timeMemory
12017108pete8Simurgh (IOI17_simurgh)C++20
51 / 100
92 ms2632 KiB
#include "simurgh.h"
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int mxn=505;

int pa[mxn+10];
vector<int>have[mxn+10];
int find(int u){return (pa[u]==u)?u:pa[u]=find(pa[u]);}
bool merge(int a,int b){
	a=find(a),b=find(b);
	if(a==b)return false;
	if(have[a].size()<have[b].size())swap(a,b);
	pa[b]=a;
	for(auto i:have[b])have[a].pb(i);
	return true;
}
void init(int n){
	for(int i=0;i<=n;i++){
		pa[i]=i;
		have[i].clear();
		have[i].pb(i);
	}
}

int mark[mxn+10];
int E[mxn+10][mxn+10],done[mxn+10][mxn+10];
int bro=0;
vector<int> find_roads(int n, vector<int> u,vector<int> v) {
	vector<int>ans;
	for(int i=0;i<n;i++)for(int j=0;j<n;j++)E[i][j]=-1;
	for(int i=0;i<u.size();i++){
		E[u[i]][v[i]]=i;
		E[v[i]][u[i]]=i;
	}
	for(int node=0;node<n;node++){
		init(n);
		vector<int>edge;
		for(int j=0;j<u.size();j++)if(u[j]!=node&&v[j]!=node&&merge(u[j],v[j])){
			edge.pb(j);
		}
		vector<int>head;
		vector<int>addedge;
		for(int i=0;i<n;i++)if(i!=node&&!mark[find(i)]){
			head.pb(find(i));
			for(auto j:have[find(i)])if(E[node][j]!=-1){
				addedge.pb(E[node][j]);
				break;
			}
			if(addedge.size()!=head.size())assert(0);
			mark[find(i)]=1;
		}
		for(int i=0;i<n;i++)mark[i]=0;
		for(int i=0;i<head.size();i++){
			for(int j=0;j<addedge.size();j++)if(j!=i)edge.pb(addedge[j]);
			int c=0,mx=0;
			vector<int>val;
			for(auto j:have[head[i]]){
				if(E[node][j]==-1){
					val.pb(-1);
					continue;
				}
				if(j<node){
					if(c>0||done[node][j]==0){
						val.pb(-1);
						continue;
					}
					c++;
				}
				edge.pb(E[node][j]);

				bro++;
				if(bro>30000)assert(0);

				val.pb(count_common_roads(edge));
				mx=max(mx,val.back());
				edge.pop_back();
			}
			if(mx==0)assert(0);
			for(int j=0;j<have[head[i]].size();j++)if(val[j]==mx&&have[head[i]][j]>node){
				done[node][have[head[i]][j]]=1;
				done[have[head[i]][j]][node]=1;
				ans.pb(E[node][have[head[i]][j]]);
			}
			for(int j=0;j<addedge.size()-1;j++)edge.pop_back();
		}
	}
	return ans;
}

/*
4 6
0 1
0 2
0 3
1 2
1 3
2 3
0 1 5


5 9
2 1
1 4
4 0
0 3
3 4
2 4
1 3
0 2
0 1
0 1 2 3 
*/
#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...