Submission #264748

#TimeUsernameProblemLanguageResultExecution timeMemory
264748patrikpavic2Towns (IOI15_towns)C++17
0 / 100
8 ms2688 KiB
/**
* user:  ppavic
* fname: Patrik
* lname: Pavić
* task:  towns
* score: 0.0
* date:  2019-06-23 11:08:12.761811
*/
#include "towns.h"
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

#define PB push_back
#define X first
#define Y second

using namespace std;

const int N = 505;
const int INF = 0x3f3f3f3f;

typedef pair < int, int > pii;
typedef vector < pii > vp;
typedef vector < int > vi;

int dis[N][N], un[N], sk, n;
vp v[N];

void spajaj(){
	int piv = 0, edg = 0;
	for(;!un[piv];piv++);
	vi klik;
	for(int i = 0;i < n;i++){
		if(i == piv || !un[i]) continue;
		int mx = -INF, mi = INF;
		for(int j = 0;j < n;j++){

			if(j == i) continue;
			if(j == piv || !un[j]) continue;
			mi = min(mi, dis[i][j] - dis[piv][j]);	
			mx = max(mi, dis[i][j] - dis[piv][j]);	
		}
		//printf("mi %d mx %d i %d piv %d\n", mi, mx, i, piv);
		if(mi != mx) continue;
		if(dis[piv][n] && dis[piv][n]  != (dis[i][piv] - mi) / 2) continue;
		dis[piv][n] = (dis[i][piv] - mi) / 2;
		dis[i][n]   = (dis[i][piv] + mi) / 2;
		dis[n][i] = dis[i][n];
		dis[n][piv] = dis[piv][n];
		v[n].PB({i, dis[i][n]});
		v[i].PB({n, dis[i][n]});
		//printf("%d spojena na %d s tezinom %d\n", i, n, dis[i][n]);
		sk--;// un[i] = 0;
		klik.PB(i);
	}
	for(int x : klik) un[x] = 0;
	v[n].PB({piv, dis[piv][n]});
	v[piv].PB({n, dis[piv][n]});
	//printf("%d spojena na %d s tezinom %d\n", piv, n, dis[piv][n]);

	un[n] = 1; un[piv] = 0;
	for(int i = 0;i < n;i++){
		if(!un[i]) continue;
		dis[n][i] = dis[piv][i] - dis[piv][n];
		//printf("dis %d %d je %d\n", n, i, dis[n][i]);
		dis[i][n] = dis[n][i];
	}
	n++; 
	//printf("gotov\n");
}

int R(int x,int lst){
	int ret = 0;
	for(pii y : v[x]){
		if(y.X == lst) continue;
		ret =  max(R(y.X, x) + y.Y, ret);
	}
	return ret;
}

int C(int x,int lst){
	if(v[x].size() == 1) return 1;
	int ret = 0;
	for(pii y : v[x]){
		if(y.X == lst) continue;
		ret += C(y.X, x);
	}
	return ret;
}

int hubDistance(int nn, int sub) {
	for(int i = 0;i < N;i++) v[i].clear(), un[i] = 0;
	memset(dis, 0, sizeof(dis));
	n = nn;
	for(int i = 0;i < n;i++){
		dis[i][i] = 0; un[i] = 1;
		for(int j = i + 1;j < n;j++){
			dis[i][j] = getDistance(i, j);
			dis[j][i] = dis[i][j];
		}
	}
	sk = n;
	int T = 0;
	while(sk > 1){
		spajaj();
	}
	int ans = INF, ima = 0;
	for(int i = nn;i < n;i++)
		ans = min(ans, R(i, i));
	for(int i = nn;i < n;i++){
		if(R(i, i) != ans) continue;
		int pos = 1;
		for(pii y : v[i]){
			if(C(y.X, i) > 2 * n) pos = 0;
		}		
		ima += pos;
	}
	if(sub < 3) return ans;
	if(ima) return ans;
	return -ans;
}




Compilation message (stderr)

towns.cpp: In function 'void spajaj()':
towns.cpp:32:15: warning: unused variable 'edg' [-Wunused-variable]
   32 |  int piv = 0, edg = 0;
      |               ^~~
towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:105:6: warning: unused variable 'T' [-Wunused-variable]
  105 |  int T = 0;
      |      ^
#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...