제출 #587584

#제출 시각아이디문제언어결과실행 시간메모리
587584benson1029도시들 (IOI15_towns)C++14
35 / 100
17 ms356 KiB
#include "towns.h"
#include<bits/stdc++.h>
using namespace std;

int dis0[200], disX[200], disY[200];
vector<int> mid, mid2;
int X, Y;

bool checkdiff(int a, int b) {
	int ad = (disX[Y] + disX[a] + disY[a]) / 2 - disX[Y];
	int bd = (disX[Y] + disX[b] + disY[b]) / 2 - disX[Y];
	if(getDistance(a, b) == ad+bd) return true;
	return false;
}

int hubDistance(int N, int sub) {
	X = 1;
	for(int i=1; i<N; i++) {
		dis0[i] = getDistance(0, i);
		if(dis0[i] > dis0[X]) {
			X = i;
		}
	}
	Y = 0;
	for(int i=0; i<N; i++) {
		if(i==X) continue;
		disX[i] = getDistance(X, i);
		if(disX[i] > disX[Y]) {
			Y = i;
		}
	}
	// diameter: X to Y
	for(int i=0; i<N; i++) {
		if(i==Y) continue;
		disY[i] = getDistance(Y, i);
	}
	int ans = 1e9;
	int C = 0;
	for(int i=0; i<N; i++) {
		if(i==X || i==Y) continue;
		int sum = (disX[Y] + disX[i] + disY[i]) / 2;
		int tmp = max(sum - disX[i], sum - disY[i]);
		if(tmp < ans) {
			C = i;
			ans = tmp;
		}
	}
	int sumC = (disX[Y] + disX[C] + disY[C]) / 2;
	mid.clear();
	int compX = 1, compY = 1, oth = N - 2;
	for(int i=0; i<N; i++) {
		if(i==X || i==Y) continue;
		int sum = (disX[Y] + disX[i] + disY[i]) / 2;
		if(sum - disY[i] < sumC - disY[C]) {
			compX++;
			oth--;
		} else if(sum - disX[i] < sumC - disX[C]) {
			compY++;
			oth--;
		} else mid.push_back(i);
	}
	if(sub <= 2) return ans;
	if(sub==4) {
		if(compX <= N/2 && compY <= N/2 && oth <= N/2) return ans;
		else return -ans;
	} else if(sub >= 3) {
		mid2 = mid;
		while(mid.size() >= 2) {
			vector<int> tmp;
			tmp.clear();
			for(int i=0; i<mid.size()-1; i+=2) {
				if(checkdiff(mid[i], mid[i+1])) {
					
				} else {
					tmp.push_back(mid[i]);
				}
			}
			if(mid.size()%2==1) tmp.push_back(mid[mid.size()-1]);
			mid = tmp;
		}
		if(mid.size() == 1) {
			int cnt = 0;
			for(int i:mid2) {
				if(!checkdiff(i, mid[0])) {
					cnt++;
				}
			}
			if(cnt > N/2 || compX > N/2 || compY > N/2) return -ans;
			else return ans;
		}
		if(compX > N/2 || compY > N/2) return -ans;
		return ans;
	}
	return ans;
}

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

towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:71:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |    for(int i=0; i<mid.size()-1; i+=2) {
      |                 ~^~~~~~~~~~~~~
#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...