Submission #46257

# Submission time Handle Problem Language Result Execution time Memory
46257 2018-04-18T09:33:11 Z RayaBurong25_1 Towns (IOI15_towns) C++17
48 / 100
25 ms 1796 KB
#include "towns.h"
#include <vector>
#include <map>
#include <algorithm>
#include <stdio.h>
#include <cassert>
int Dist[111][111];
int X[111];
int L[111] = {0}, Ln[111] = {0};
int M[111] = {0}, Mn[111] = {0};
int R[111] = {0}, Rn[111] = {0};
std::map<int, std::vector<std::pair<int, int> > > Map;
int calcMn(std::vector<std::pair<int, int> > V)
{
	int In[111] = {0};
	int Cnt, Max = 0;
	int i, j;
	for (i = 0; i < V.size(); i++)
		In[i] = 0;
	for (i = 0; i < V.size(); i++)
	{
		if (!In[i])
		{
			Cnt = 1;
			In[i] = 1;
			for (j = 0; j < V.size(); j++)
			{
				if (!In[j] && getDistance(V[i].second, V[j].second) < V[i].first + V[j].first)
				{
					In[j] = 1;
					Cnt++;
				}
			}
			if (Cnt > Max)
				Max = Cnt;
		}
	}
	return Max;
}
int hubDistance(int N, int sub)
{
	int i, j;
	for (i = 0; i < N; i++)
	{
		for (j = 0; j < N; j++)
		{
			if (i == j)
				Dist[i][j] = 0;
			else
				Dist[i][j] = -1;
		}
	}
	int u = 0;
	for (i = 0; i < N; i++)
	{
		if (Dist[0][i] == -1)
		{
			Dist[0][i] = getDistance(0, i);
			Dist[i][0] = Dist[0][i];
		}
		if (Dist[0][i] > Dist[0][u])
			u = i;
	}
	int v = u;
	for (i = 0; i < N; i++)
	{
		if (Dist[u][i] == -1)
		{
			Dist[u][i] = getDistance(u, i);
			Dist[i][u] = Dist[u][i];
		}
		if (Dist[u][i] > Dist[u][v])
			v = i;
	}
	for (i = 0; i < N; i++)
	{
		if (Dist[v][i] == -1)
		{
			Dist[v][i] = getDistance(v, i);
			Dist[i][v] = Dist[v][i];
		}
	}
	// printf("diameter %d-%d\n", u, v);
	int x, y;
	std::vector<std::pair<int, int> > emptyv(0);
	Map.clear();
	// assert(Map.empty());
	for (i = 0; i < N; i++)
	{
		y = (Dist[u][i] + Dist[i][v] - Dist[u][v])/2;
		x = Dist[u][i] - y;
		assert(x >= 0 && y >= 0);
		// printf("i%d x%d y%d\n", i, x, y);
		if (Map.find(x) == Map.end())
		{
			Map.insert({x, emptyv});
		}
		Map[x].push_back({y, i});
	}
	int Ans = 1000000007, Hub = 0;
	std::map<int, std::vector<std::pair<int, int> > >::iterator it;
	for (it = Map.begin(), i = 0; it != Map.end(); it++, i++)
	{
		X[i] = it->first;
		assert(X[i] >= 0 && X[i] <= Dist[u][v]);
		Mn[i] = it->second.size();
		if (i > 0)
		{
			L[i] = std::max(L[i - 1], M[i - 1]) + (X[i] - X[i - 1]);
			Ln[i] = Ln[i - 1] + Mn[i - 1];
		}
		else
		{
			L[i] = 0;
			Ln[i] = 0;
		}
		M[i] = 0;
		for (j = 0; j < it->second.size(); j++)
			M[i] = std::max(M[i], it->second[j].first);
	}
	int l = i;
	it--;
	for (i = l - 1; i >= 0; i--, it--)
	{
		if (i < l - 1)
		{
			R[i] = std::max(R[i + 1], M[i + 1]) + (X[i + 1] - X[i]);
			Rn[i] = Rn[i + 1] + Mn[i + 1];
		}
		else
		{
			R[i] = 0;
			Rn[i] = 0;
		}
		assert(L[i] >= 0 && L[i] <= Dist[u][v]);
		assert(M[i] >= 0 && M[i] <= Dist[u][v]);
		assert(R[i] >= 0 && R[i] <= Dist[u][v]);
		// printf("L%d M%d R%d\n", L[i], M[i], R[i]);
		if (std::max(std::max(L[i], M[i]), R[i]) <= Ans)
		{
			if (std::max(std::max(L[i], M[i]), R[i]) < Ans)
				Hub = 0;
			Ans = std::max(std::max(L[i], M[i]), R[i]);
			if (sub == 3)
			{
				Hub |= (std::max(std::max(Ln[i], calcMn(it->second)), Rn[i]) <= N/2);
			}
			else if (sub == 4)
			{
				Hub |= (std::max(std::max(Ln[i], Mn[i]), Rn[i]) <= N/2);
			}
		}
	}
	// assert(Dist[u][v] != -1);
	// assert(Ans <= Dist[u][v]);
	if (Hub)
		return Ans;
	else
		return -Ans;
}

Compilation message

towns.cpp: In function 'int calcMn(std::vector<std::pair<int, int> >)':
towns.cpp:18:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (i = 0; i < V.size(); i++)
              ~~^~~~~~~~~~
towns.cpp:20:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (i = 0; i < V.size(); i++)
              ~~^~~~~~~~~~
towns.cpp:26:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for (j = 0; j < V.size(); j++)
                ~~^~~~~~~~~~
towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:106:26: warning: conversion to 'int' from 'std::vector<std::pair<int, int> >::size_type {aka long unsigned int}' may alter its value [-Wconversion]
   Mn[i] = it->second.size();
           ~~~~~~~~~~~~~~~^~
towns.cpp:118:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (j = 0; j < it->second.size(); j++)
               ~~^~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 21 ms 376 KB Output is correct
2 Correct 17 ms 520 KB Output is correct
3 Correct 2 ms 520 KB Output is correct
4 Correct 22 ms 588 KB Output is correct
5 Correct 24 ms 640 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 20 ms 640 KB Output is correct
2 Correct 25 ms 676 KB Output is correct
3 Correct 21 ms 692 KB Output is correct
4 Correct 22 ms 712 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 18 ms 712 KB Output is correct
2 Correct 22 ms 1276 KB Output is correct
3 Correct 2 ms 1276 KB Output is correct
4 Correct 23 ms 1768 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 22 ms 1792 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 16 ms 1796 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 16 ms 1796 KB Output isn't correct
2 Halted 0 ms 0 KB -