Submission #1200990

#TimeUsernameProblemLanguageResultExecution timeMemory
12009908pete8Towns (IOI15_towns)C++20
61 / 100
10 ms328 KiB
#include "towns.h"
#include<bits/stdc++.h>
#define pb push_back
#define pii pair<int,int>
#define f first
#define s second
using namespace std;
const int mxn=200,inf=1e9;
int dist[mxn+10][mxn+10],N;
int getdist(int a,int b){
	if(b<a)swap(a,b);
	if(a==b)return 0;
	if(dist[a][b])return dist[a][b];
	return dist[a][b]=getDistance(a,b);
}
void re(){
	for(int i=0;i<N;i++)for(int j=0;j<N;j++)dist[i][j]=0;
}
namespace sub12{
	int solve(){
		re();
		int ca=0,A=0,B=0;
		for(int i=0;i<N;i++){
			if(getdist(B,i)>ca){
				ca=getdist(B,i);
				A=i;
			}
		}
		ca=0;
		for(int i=0;i<N;i++){
			if(getdist(A,i)>ca){
				ca=getdist(A,i);
				B=i;
			}
		}
		int ans=inf;
		for(int i=0;i<N;i++){
			int x=(getdist(i,A)+getdist(i,B)-ca)/2;
			ans=min(ans,max(getdist(i,A),getdist(i,B))-x);
		}
		return ans;
	}
};
mt19937 rng(time(NULL));
namespace sub35{
	int solve(){
		re();
		int ca=0,A=0,B=0;
		for(int i=0;i<N;i++){
			if(getdist(B,i)>ca){
				ca=getdist(B,i);
				A=i;
			}
		}
		ca=0;
		for(int i=0;i<N;i++){
			if(getdist(A,i)>ca){
				ca=getdist(A,i);
				B=i;
			}
		}
		int ans=inf;
		int K;
		vector<pii>v;
		for(int i=0;i<N;i++){
			int x=(getdist(i,A)+getdist(i,B)-ca)/2;
			v.pb({i,getdist(i,A)-x});
			ans=min(ans,max(getdist(i,A),getdist(i,B))-x);
		}
		int c1=0,c2=0;
		vector<int>have;
		for(int i=0;i<N;i++){
			if(v[i].s<ans)c1++;
			else if(v[i].s>ans)c2++;
			else have.pb(i);
		}
		if(c1>(N/2)||c2>(N/2)){
			have.clear();
			c1=0,c2=0;
			for(int i=0;i<N;i++){
				if(v[i].s<ca-ans)c1++;
				else if(v[i].s>ca-ans)c2++;
				else have.pb(i);
			}
		}
		if(c1>(N/2)||c2>(N/2))return -ans;
		if(have.size()<=(N/2))return ans;
		int cmx=have[0],c=1;
		for(int i=1;i<have.size();i++){
			if(getdist(have[i],cmx)==getdist(have[i],A)+getdist(cmx,B)-ca){
				c--;
				if(c<=0)c=1,cmx=have[i];
			}
			else c++;
		}
		int cnt=0;
		for(int i=0;i<have.size();i++){
			if(getdist(have[i],cmx)!=getdist(have[i],A)+getdist(cmx,B)-ca)cnt++;
		}
		if(cnt>(N/2))return -ans;
		return ans;
	}
};
namespace sub4{
	int solve(){
		re();
		int ca=0,A=0,B=0;
		for(int i=0;i<N;i++){
			if(getdist(B,i)>ca){
				ca=getdist(B,i);
				A=i;
			}
		}
		ca=0;
		for(int i=0;i<N;i++){
			if(getdist(A,i)>ca){
				ca=getdist(A,i);
				B=i;
			}
		}
		int ans=inf;
		int K;
		vector<pii>v;
		for(int i=0;i<N;i++){
			int x=(getdist(i,A)+getdist(i,B)-ca)/2;
			v.pb({i,getdist(i,A)-x});
			ans=min(ans,max(getdist(i,A),getdist(i,B))-x);
		}
		int c1=0,c2=0;
		vector<int>have;
		for(int i=0;i<N;i++){
			if(v[i].s<ans)c1++;
			else if(v[i].s>ans)c2++;
			else have.pb(i);
		}
		if(c1>(N/2)||c2>(N/2)){
			have.clear();
			c1=0,c2=0;
			for(int i=0;i<N;i++){
				if(v[i].s<ca-ans)c1++;
				else if(v[i].s>ca-ans)c2++;
				else have.pb(i);
			}
		}
		if(c1>(N/2)||c2>(N/2)||have.size()>(N/2))return -ans;
		return ans;
	}
};
int hubDistance(int n, int sub){
	N=n;
	if(sub<=2)return sub12::solve();
	if(sub==4)return sub4::solve();
	return sub35::solve();
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...