답안 #52128

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
52128 2018-06-24T05:57:48 Z spencercompton 도시들 (IOI15_towns) C++17
51 / 100
29 ms 724 KB
#include "towns.h"

#include <bits/stdc++.h>
using namespace std;
// int getDistance(int a, int b){
// 	cout << "?  " << a << " " << b << endl;
// 	int x;
// 	cin >> x;
// 	return x;
// }
int hubDistance(int N, int sub) {
	pair<int, int > best = make_pair(-1,-1);
	//first is dist, second is ind
	for(int i = 1; i<N; i++){
		pair<int, int> now = make_pair(getDistance(0,i),i);
		best = max(best,now);
	}
	int first = best.second;
	best = make_pair(-1,-1);
	int A[N];
	int B[N];
	for(int i = 0; i<N; i++){
		if(i==first){
			continue;
		}
		pair<int, int> now = make_pair(getDistance(first,i),i);
		A[i] = now.first;
		best = max(best,now);
	}
	int second = best.second;
	int diameter = A[second];
	int inf = 100000000;
	int ans = inf;
	vector<vector<int> > li;
	int point = 0;
	int most = N/2;
	bool balanced = false;
	map<pair<int, int>, int> m;
	vector<int> ali;
	int x[N];
	vector<pair<int, int> > pars;
	for(int i = 0; i<N; i++){
		if(i==first || i==second){
			continue;
		}
		B[i] = getDistance(i,second);
		x[i] = (A[i]+B[i]-diameter)/2;
		int a = A[i]-x[i];
		int b = B[i]-x[i];
		pair<int, int> comb = make_pair(a,b);
		bool newer = false;
		if(m.find(comb)==m.end()){
			newer = true;
			m[comb] = point++;
			vector<int> xx;
			li.push_back(xx);
			pars.push_back(make_pair(a,point-1));
		}
		li[m[comb]].push_back(i);
		if(max(a,b)<ans){
			ans = max(a,b);
			ali.clear();
			ali.push_back(point-1);
		}
		else if(max(a,b)==ans && newer){
			ali.push_back(point-1);
		}
	}
	if(sub<=2){
		return ans;
	}
	sort(pars.begin(),pars.end());
	int tot = N;
	int bef = 1;
	for(int z = 0; z<pars.size(); z++){
		int i = pars[z].second;
		if(bef>most || (tot-bef-li[i].size())>most){
			bef += li[i].size();
			continue;
		}
		bool ishub = false;
		for(int j = 0; j<ali.size(); j++){
			ishub |= ali[j]==i;
		}
		if(!ishub){
			bef += li[i].size();
			continue;
		}
		if(li[i].size()>most){
			int cur = li[i][0];
			int score = 1;
			for(int j = 1; j<li[i].size(); j++){
				// cout << "# " << score << " " << cur << endl;
				if(score==0){
					cur = li[i][j];
					score = 1;
				}
				else if(getDistance(li[i][j],cur)==x[li[i][j]]+x[cur]){
					// cout << "A " << endl;
					score--;
				}
				else{
					// cout << "B " << endl;
					score++;
				}
			}
			if(score==0){
				balanced = true;
				break;
			}
			int cnt = 1;
			for(int j = 0; j<li[i].size(); j++){
				if(li[i][j]==cur){
					bef += li[i].size();
					continue;
				}
				if(getDistance(li[i][j],cur)<x[li[i][j]]+x[cur]){
					cnt++;
				}
			}
			if(cnt <= most){
				balanced = true;
			}
			break;
		}
		else{
			balanced = true;
			break;
		}
		bef += li[i].size();
	}
	if(!balanced){
		ans = -ans;
	}
	return ans;
}

// int main(){
// 	cout << "DONE " << hubDistance(6,3) << endl;
// }

Compilation message

towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:75:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int z = 0; z<pars.size(); z++){
                 ~^~~~~~~~~~~~
towns.cpp:77:40: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(bef>most || (tot-bef-li[i].size())>most){
                  ~~~~~~~~~~~~~~~~~~~~~~^~~~~
towns.cpp:78:22: warning: conversion to 'int' from 'std::vector<int>::size_type {aka long unsigned int}' may alter its value [-Wconversion]
    bef += li[i].size();
                      ^
towns.cpp:82:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j = 0; j<ali.size(); j++){
                  ~^~~~~~~~~~~
towns.cpp:86:22: warning: conversion to 'int' from 'std::vector<int>::size_type {aka long unsigned int}' may alter its value [-Wconversion]
    bef += li[i].size();
                      ^
towns.cpp:89:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(li[i].size()>most){
      ~~~~~~~~~~~~^~~~~
towns.cpp:92:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int j = 1; j<li[i].size(); j++){
                   ~^~~~~~~~~~~~~
towns.cpp:112:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int j = 0; j<li[i].size(); j++){
                   ~^~~~~~~~~~~~~
towns.cpp:114:24: warning: conversion to 'int' from 'std::vector<int>::size_type {aka long unsigned int}' may alter its value [-Wconversion]
      bef += li[i].size();
                        ^
towns.cpp:130:21: warning: conversion to 'int' from 'std::vector<int>::size_type {aka long unsigned int}' may alter its value [-Wconversion]
   bef += li[i].size();
                     ^
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 376 KB Output is correct
2 Correct 16 ms 376 KB Output is correct
3 Correct 3 ms 564 KB Output is correct
4 Correct 21 ms 564 KB Output is correct
5 Correct 21 ms 564 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 564 KB Output is correct
2 Correct 16 ms 596 KB Output is correct
3 Correct 24 ms 600 KB Output is correct
4 Correct 22 ms 696 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 18 ms 696 KB Output is correct
2 Correct 27 ms 724 KB Output is correct
3 Correct 2 ms 724 KB Output is correct
4 Correct 21 ms 724 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 724 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 724 KB Output is correct
2 Correct 29 ms 724 KB Output is correct
3 Correct 21 ms 724 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 724 KB Output isn't correct
2 Halted 0 ms 0 KB -