Cod sursa(job #162566)

Utilizator damaDamaschin Mihai dama Data 20 martie 2008 11:24:54
Problema Popandai Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.75 kb
#include <stdio.h>
#include <algorithm>

const long long inf = (long long) 1 << 60;

#define x first
#define y second

using namespace std;

pair<long long, long long> p[310];
int n, k, nr[310][310];
long long u[310], d[310], sol;
int used[2][60000];

long long area(int i, int j, int l)
{
	return (p[i].x * p[j].y + p[j].x * p[l].y + p[l].x * p[i].y - p[i].x * p[l].y - p[j].x * p[i].y - p[l].x * p[j].y) / 2;
}

long long modul(long long a)
{
	if(a < 0)
		return -a;
	return a;
}

int main()
{
	freopen("popandai.in", "r", stdin);
	freopen("popandai.out", "w", stdout);

	int i, j, l, temp, a;

	scanf("%d %d", &n, &k);

	for(i = 1; i <= n; ++i)
	{
		scanf("%lld %lld", &p[i].x, &p[i].y);
		p[i].x *= 2;
		if(used[0][p[i].x])
		{
			used[1][p[i].x] = p[i].y;
		}
		else
		{
			used[0][p[i].x] = p[i].y;
		}
	}

	sort(p + 1, p + n + 1);

	for(i = 1; i <= n; ++i)
	{
		for(j = i + 1; j <= n; ++j)
		{
			for(l = 1; l <= n; ++l)
			{
				if(p[l].x >= p[i].x && p[l].x <= p[j].x && area(i, j, l) < 0)
				{
					++nr[i][j];
				}
			}
		}
	}
	
	//printf("%d %d %d\n", nr[4][6], nr[4][7], nr[6][7]); 
	sol = inf;

	for(i = 1; i <= n; ++i)
	{
		for(j = i + 1; j <= n; ++j)
		{
			for(l = 0; l <= n; ++l)
			{
				u[l] = d[l] = inf;
			}
			for(l = 1; l <= n; ++l)
			{
				if(l != i && l != j)
				{
					if(area(i, j, l) > 0)
					{
						if(l > j)
						{
							temp = nr[i][l] - nr[j][l] - nr[i][j] - 1;
							if(used[1][p[j].x] && (p[j].y > used[0][p[j].x] || p[j].y > used[1][p[j].x]))
								++temp;
						}
						else if(l < i)
						{
							temp = nr[l][j] - nr[l][i] - nr[i][j] - 1;
							if(used[1][p[i].x] && (p[i].y > used[0][p[i].x] || p[i].y > used[1][p[i].x]))
								++temp;
						}
						else
						{
							temp = nr[i][l] + nr[l][j] - nr[i][j];
						}
						a = modul(area(i, j, l));
						//printf("%d %d %d %d\n", i, j, l, temp);
						if(u[temp] > a)
						{
							u[temp] = a;
						}
					}
					else
					{
						if(l > j)
						{
							temp = nr[i][j] + nr[j][l] - nr[i][l];
						}
						else if(l < i)
						{
							temp = nr[l][i] + nr[i][j] - nr[l][j];
						}
						else
						{
							temp = nr[i][j] - nr[i][l] - nr[l][j] - 1;
							if(used[1][p[l].x] && (p[l].y > used[0][p[i].x] || p[l].y > used[1][p[i].x]))
								++temp;
						}
					//	printf("%d %d %d %d\n", i, j, l, temp);
						a = modul(area(i, j, l));
						if(d[temp] > a)
						{
							d[temp] = a;
						}
					}
				}
			}
			for(l = k - 1; l >= 0; --l)
			{
				if(u[l] > u[l + 1])
				{
					u[l] = u[l + 1];
				}
				if(d[l] > d[l + 1])
				{
					d[l] = d[l + 1];
				}
			}
			for(l = 0; l <= k; ++l)
			{
				if(u[l] + d[k - l] < sol)
				{
					sol = u[l] + d[k - l];
				}
			}
		}
	}

	if(sol % 2 == 0)
	{
		printf("%lld.0", sol / 2);
	}
	else
	{
		printf("%lld.5", sol / 2);
	}

	return 0;
}