제출 #1273155

#제출 시각아이디문제언어결과실행 시간메모리
1273155vtnoo도시들 (IOI15_towns)C++20
13 / 100
10 ms1848 KiB
#include "towns.h"
#include <bits/stdc++.h>
using namespace std;

const int MAXN=110;
int D[MAXN][MAXN];

int hubDistance(int N, int sub) {
	memset(D, -1, sizeof(D));
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++){
			if(i==j)D[i][j]=0;
			if(D[i][j]==-1){
				D[i][j]=getDistance(i,j);
				D[j][i]=D[i][j];
			}
		}
	}
	int b, c, s1=0, s2=0; 
	for(int i=0;i<N;i++){
		if(D[0][i]>s1){
			b=i;
			s1=D[0][i];
		}
	}
	for(int i=0;i<N;i++){
		if(D[b][i]>s2){
			c=i;
			s2=D[b][i];
		}
	}
	int diam=D[b][c], r=1e9;
	map<int, vector<int>> mp;
	vector<int> h(N);
	for(int i=0;i<N;i++){
		if(i==c||i==b)continue; 
		int to_diam=(D[i][b]+D[b][c]-D[i][c])/2;
		int mx=max(diam-to_diam, to_diam);
		r=min(r, mx);
		mp[to_diam].push_back(i);
		h[i]=D[i][b]-to_diam;
	}
	//cout<<b<<" "<<c<<endl;
	/* for(int i=0;i<N;i++){
		cout<<h[i]<<" ";
	}
	cout<<endl;  */
	bool exist=false;
	int lef=N, rig=0;
	for(auto [cand,v]:mp){
		lef-=v.size();
		if((cand==r||diam-cand==r)&&(lef<=N/2&&rig<=N/2)){
			vector<int> treeSizes;
			int maxSubtree=0;
			for(auto x:v){
				int curSubtree=0;
				for(auto y:v){
					if(h[x]+h[y]!=D[x][y]){
						curSubtree++;
					}
				}
				maxSubtree=max(maxSubtree, curSubtree);
			}
			if(maxSubtree<=N/2){
				exist=true;
			}
		}
		rig+=v.size();
	}
	if(!exist)r=-r;
	return r;
}
#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...