Submission #1316669

#TimeUsernameProblemLanguageResultExecution timeMemory
1316669PlayVoltzTowns (IOI15_towns)C++20
49 / 100
10 ms476 KiB
#include "towns.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define fi first
#define se second

map<int, map<int, int> > mmm;

int query(int a, int b){
	if (a==b)return 0;
	if (!mmm[min(a, b)][max(a, b)])mmm[min(a, b)][max(a, b)]=getDistance(min(a, b), max(a, b))+1;
	return mmm[min(a, b)][max(a, b)]-1;
}

int hubDistance(int n, int sub){
	mmm.clear();
	int mx=-1, a=0, b=0, ans=INT_MAX/2, dia=0;
	for (int i=1; i<n; ++i)if (query(a, i)>mx)mx=query(a, i), b=i;
	for (int i=0; i<n; ++i)dia=max(dia, query(b, i));
	vector<pii> vect;
	for (int i=0; i<n; ++i)vect.pb(mp((query(a, b)+query(b, i)-query(a, i))/2, i)), ans=min(ans, max(vect.back().fi, dia-vect.back().fi));
	sort(vect.begin(), vect.end());
	for (int i=0; i<n; ++i)if (max(vect[i].fi, dia-vect[i].fi)==ans){
		int l=i, r=i, d=vect[i].fi, c=0, count=0, sz=0;
		while (r+1<n&&vect[r+1].fi==d)++r;
		if (l>n/2||n-r-1>n/2)continue;
		for (int j=l; j<=r; ++j){
			if (!count)count=1, c=vect[j].se;
			else if (query(vect[j].se, c)!=query(b, vect[j].se)+query(b, c)-2*d)++count;
			else --count;
		}
		for (int j=l; j<=r; ++j)if (query(vect[j].se, c)!=query(b, vect[j].se)+query(b, c)-2*d)++sz;
		if (sz<=n/2)return ans;
		i=r;
	}
	return -ans;
}
#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...