Submission #1258595

#TimeUsernameProblemLanguageResultExecution timeMemory
1258595kl0989eTowns (IOI15_towns)C++20
100 / 100
11 ms328 KiB
#include "towns.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pi pair<int, int>
#define pl pair<ll, ll>
#define vi vector<int>
#define vl vector<ll>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(),(x).end()

const int maxn=110;

map<pi,int> mem;

int query(int i, int j) {
	if (mem[{i,j}]) {
		return mem[{i,j}];
	}
	if (mem[{j,i}]) {
		return mem[{j,i}];
	}
	if (i==j) {
		return 0;
	}
	return mem[{i,j}]=getDistance(i,j);
}

int hubDistance(int n, int sub) {
	mem.clear();
	int i=1;
	for (int k=0; k<n; k++) {
		if (query(0,k)>query(0,i)) {
			i=k;
		}
	}
	int j=0;
	for (int k=0; k<n; k++) {
		if (query(i,k)>query(i,j)) {
			j=k;
		}
	}
	int d=query(i,j);
	int ans=2e9;
	bool has=0;
	map<int,vi> dst;
	for (int k=0; k<n; k++) {
		int tdst=(query(i,0)+query(i,k)-query(0,k))/2;
		dst[tdst].pb(k);
		ans=min(ans,max(tdst,d-tdst));
	}
	int a=0, b=0, c=n;
	for (auto [tdst,inds]:dst) {
		c-=inds.size();
		b=inds.size();
		if (max(tdst,d-tdst)==ans && a<=n/2 && c<=n/2) {
			if (b<=n/2) {
				has=1;
				break;
			}
			else {
				vi in(n,0);
				for (auto t:inds) {
					in[t]=1;
				}
				vi gr,oth;
				for (int k=0; k<n; k++) {
					if (!oth.size()) {
						oth.pb(k);
					}
					else if (in[k] && in[oth.back()] && (query(i,k)+query(i,oth.back())-query(k,oth.back()))/2!=tdst) {
						gr.pb(k);
					}
					else {
						oth.pb(k);
						if (gr.size()) {
							oth.pb(gr.back());
							gr.pop_back();
						}
					}
				}
				int t=oth.back();
				while (oth.size()) {
					if (in[t] && in[oth.back()] && (query(i,t)+query(i,oth.back())-query(t,oth.back()))/2!=tdst) {
						if (oth.size()==1) {
							gr.pb(oth.back());
							oth.pop_back();
						}
						else {
							oth.pop_back();
							oth.pop_back();
						}
					}
					else {
						oth.pop_back();
						if (!gr.size()) {
							break;
						}
						gr.pop_back();
					}
				}
				if (!gr.size()) {
					has=1;
					break;
				}
			}
		}
		a+=inds.size();
	}
	return (has?ans:-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...