Submission #387448

# Submission time Handle Problem Language Result Execution time Memory
387448 2021-04-08T12:24:27 Z alireza_kaviani Towns (IOI15_towns) C++11
48 / 100
22 ms 492 KB
#include <bits/stdc++.h>
#include "towns.h"
using namespace std;

#define SZ(x)		int(x.size())
#define sep			' '

const int MAXN = 110 + 10;
const int MOD = 1e9 + 7;

int cnt , dist[4][MAXN] , val[MAXN][MAXN];

int get(int v , int u){
	if(val[v][u] != -1)	return val[v][u];
	if(v == u)	return 0;
	val[v][u] = val[u][v] = getDistance(v , u); cnt--;
	assert(cnt >= 0);
	return val[v][u];
}

int ask(int ind , int v , int n){
	int mx = 0;
	for(int i = 0 ; i < n ; i++){
		dist[ind][i] = get(v , i);
		if(dist[ind][i] > dist[ind][mx])	mx = i;
	}
	return mx;
}

int hubDistance(int N, int sub) {
	memset(val , -1 , sizeof(val)); cnt = N * (N - 1) / 2;
	int v = ask(0 , 0 , N);
	int u = ask(1 , v , N);
	ask(2 , u , N);
	int mn = MOD;
	for(int i = 0 ; i < N ; i++){
		mn = min(mn , abs(dist[1][i] - dist[2][i]));
//		cout << i << sep << dist[1][i] << sep << dist[2][i] << endl; 
	}
//	cout << v << sep << u << endl;
	int xl = 0 , xr = 0 , yl = 0 , yr = 0;
	vector<int> v1 , v2;
	for(int i = 0 ; i < N ; i++){
		int val = dist[1][i] - dist[2][i];
		dist[3][i] = (dist[1][i] + dist[2][i] - dist[1][u]) / 2;
//		cout << i << sep << dist[3][i] << endl;
		if(val < -mn)	xl++;
		else if(val == -mn)	yl++ , v1.push_back(i);
		else if(val == mn)	yr++ , v2.push_back(i);
		else if(val > mn)	xr++;
	}
	int R = (dist[1][u] + mn) / 2;
//	cout << R << endl;
	if(xl <= N / 2 && yl <= N / 2 && xr + yr <= N / 2)	return R;
	if(xr <= N / 2 && yr <= N / 2 && xl + yl <= N / 2)	return R;
	if(sub == 2 || sub == 4)	return -R;
//	cout << 1 << sep << R << endl;
	yl = yr = 0;
//	cout << SZ(v1) << sep << mn << sep << v << sep << u << endl;
	for(int i = 0 ; i < SZ(v1) ; i++){
		int cur = 1;
		for(int j = 0 ; j < i ; j++){
//			cout << v1[i] << sep << v1[j] << endl;
			if(dist[3][v1[i]] + dist[3][v1[j]] > get(v1[i] , v1[j]))	cur++;
		}
		yl = max(yl , cur);
	}
//	cout << 2 << sep <<  R << endl;
	for(int i = 0 ; i < SZ(v2) ; i++){
		int cur = 1;
		for(int j = 0 ; j < i ; j++){
			if(dist[3][v2[i]] + dist[3][v2[j]] > get(v2[i] , v2[j]))	cur++;
		}
		yr = max(yr , cur);
	}
	//cout << xl << sep << yl << sep << xr << sep << yr << endl;
//	cout << 3 << sep <<  R << endl;
	if(xl <= N / 2 && yl <= N / 2 && xr + SZ(v2) <= N / 2)	return R;
	if(xr <= N / 2 && yr <= N / 2 && xl + SZ(v1) <= N / 2)	return R;
	return -R;
}

Compilation message

towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:44:7: warning: declaration of 'val' shadows a global declaration [-Wshadow]
   44 |   int val = dist[1][i] - dist[2][i];
      |       ^~~
towns.cpp:11:27: note: shadowed declaration is here
   11 | int cnt , dist[4][MAXN] , val[MAXN][MAXN];
      |                           ^~~
# Verdict Execution time Memory Grader output
1 Correct 20 ms 364 KB Output is correct
2 Correct 16 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 22 ms 364 KB Output is correct
5 Correct 22 ms 364 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 20 ms 364 KB Output is correct
2 Correct 17 ms 364 KB Output is correct
3 Correct 21 ms 364 KB Output is correct
4 Correct 22 ms 364 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 364 KB Output is correct
2 Correct 22 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 22 ms 492 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 22 ms 364 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 364 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 364 KB Output isn't correct
2 Halted 0 ms 0 KB -