제출 #744908

#제출 시각아이디문제언어결과실행 시간메모리
744908myrcellaTowns (IOI15_towns)C++17
25 / 100
18 ms404 KiB
//by szh
#include<bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define pii pair<int,int>
#define pll pair<long long,long long>
#define pb push_back
#define debug(x) cerr<<#x<<"="<<x<<endl
#define pq priority_queue
#define inf 0x3f
#define rep(i,a,b) for (int i=a;i<(b);i++)
#define MP make_pair
#define SZ(x) (int(x.size()))
#define ll long long
#define mod 1000000007
#define ALL(x) x.begin(),x.end()
void inc(int &a,int b) {a=(a+b)%mod;}
void dec(int &a,int b) {a=(a-b+mod)%mod;}
int lowbit(int x) {return x&(-x);}
ll p0w(ll base,ll p) {ll ret=1;while(p>0){if (p%2ll==1ll) ret=ret*base%mod;base=base*base%mod;p/=2ll;}return ret;}


const int maxn = 111;

#include "towns.h"

int u=0,n;
int dis[maxn][maxn];
vector <pii> nodee;

int getdis(int x,int y) {
	if (x==y) return 0;
	if (dis[x][y]==-1) dis[x][y] = dis[y][x] = getDistance(x,y);
	return dis[x][y];
}

bool samebranch(int x,int y,int R) {
	if (getdis(x,u) + getdis(y,u) - getdis(x,y) > 2*R) return true;
	assert(getdis(x,u) + getdis(y,u) - getdis(x,y) == 2*R); 
	return false;
}

bool check(int R) {
	int cnt = 0;
	vector <pii> node = nodee;
	while (!node.empty() and node.back().fi!=R) cnt++,node.pop_back();
	if (cnt*2>n) return false;
	cnt = 0;
	reverse(ALL(node));
	while (!node.empty() and node.back().fi!=R) cnt++,node.pop_back();
	if (cnt*2>n) return false;
	vector <pii> alive,dead;
	for (auto it:node) alive.pb({it.se,1});
	pii hi = {-1,-1};
	while (1) {
		if (SZ(alive)%2==1) {
			if (hi.fi==-1) {
				hi = alive.back();
				alive.pop_back();
			}
			else alive.pb(hi);
		}
		if (alive.empty()) break;
		vector <pii> tmp;
		while (!alive.empty()) {
			auto it1 = alive.back();alive.pop_back();
			auto it2 = alive.back();alive.pop_back();
			
			if (samebranch(it1.fi,it2.fi,R)) {
				tmp.pb({it1.fi,it1.se + it2.se});
				if ((it1.se + it2.se)*2>n) return false;
			}
			else dead.pb(it1),dead.pb(it2);
		}
		alive = tmp;
	}
	if (hi.fi==-1) return true;
	cnt = hi.se;
	if (cnt*2>n) return false;
	for (auto it:dead) {
		if (samebranch(it.fi,hi.fi,R)) {
			cnt += it.se;
			if (cnt*2>n) return false;
		}
	}
	return true;
}

int hubDistance(int N, int sub) {
	n = N;
	u = 0;
	memset(dis,-1,sizeof(dis));
	rep(i,0,N) if (getdis(0,i) > getdis(0,u)) u = i;
	int diam = 0;
	rep(i,0,N) diam = max(diam,getdis(i,u));
	int ans = mod;
	//find centre
	nodee.clear();
	rep(i,0,N) {
		int disi0 = getdis(i,0), disu0 = getdis(u,0), disui = getdis(u,i);
		int cur = (disu0 + disui - disi0)/2;
		assert((disu0+disui-disi0)%2==0);
		nodee.pb({cur,i});
		ans = min(ans,max(cur,diam-cur));
	}
	sort(ALL(nodee));
	if (check(ans) or check(diam-ans)) return ans;
	else return -ans;
}

컴파일 시 표준 에러 (stderr) 메시지

towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:91:28: warning: unused parameter 'sub' [-Wunused-parameter]
   91 | int hubDistance(int N, int sub) {
      |                        ~~~~^~~
#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...