Cod sursa(job #1171943)

Utilizator Kira96Denis Mita Kira96 Data 16 aprilie 2014 16:20:02
Problema Popandai Scor 88
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include<fstream>
#include<cstring>
#define N 310
#include<cmath>
#include<iomanip>
#include<algorithm>
#define x first
#define y second
#define inf 0x3f3f3f3f
#define FOR(a,b,c) for(int a=b;a<=c;a++)
using namespace std;
ifstream f("popandai.in");
ofstream g("popandai.out");
pair<int,int> v[N];
pair<pair<int,int> , int> a[N];
int det(int xa,int ya,int xb,int yb,int xc,int yc)
{
	long long D= 1LL*xa*yb+1LL*xb*yc+1LL*ya*xc-(1LL*xb*ya+1LL*xc*yb+1LL*xa*yc);
	return (int)D;
}
int n,l,detu,q,w,e,nrp,poz[N],neg[N],best,und[N][N];
int main ()
{
	f>>n>>l;
	FOR(i,1,n)
	f>>v[i].x>>v[i].y;
	sort(v+1,v+n+1);
	FOR(i,1,n)
	FOR(j,i+1,n)
	FOR(k,j+1,n)
	{
		if(det(v[i].x,v[i].y,v[k].x,v[k].y,v[j].x,v[j].y)<0)
		{
			und[i][k]++;
			und[k][i]++;
		}
	}
	best=inf;
	FOR(i,1,n)
	FOR(j,1,i-1)
	{
		if(i==8&&j==5)
		{
			i++;
			i--;
		}
		memset(poz,inf,sizeof(poz));
		memset(neg,inf,sizeof(neg));
		FOR(k,1,n)
		{
			a[1].x.x=v[i].x;
			a[1].x.y=v[i].y;
			a[2].x.x=v[j].x;
			a[2].x.y=v[j].y;
			a[3].x.x=v[k].x;
			a[3].x.y=v[k].y;
			a[1].y=i;
			a[2].y=j;
			a[3].y=k;
			
			sort(a+1,a+4);
			
			if(v[i].x<v[j].x||(v[i].x==v[j].x&&v[i].y<v[j].y))
			detu=det(v[i].x,v[i].y,v[j].x,v[j].y,v[k].x,v[k].y);
			else
			detu=det(v[j].x,v[j].y,v[i].x,v[i].y,v[k].x,v[k].y);	
			
			q=a[1].y; w=a[2].y; e=a[3].y;
			if(detu<0)
			{
				detu=-detu;
				if(a[2].y!=k)
				nrp=und[q][w]+und[w][e]-und[q][e];
				else
					nrp=und[q][e]-und[q][w]-und[e][w]-1;
				if(detu<neg[nrp])
					neg[nrp]=detu;
			}
			else
			if(detu>0)
			{
				if(a[2].y==k)
				nrp=und[q][w]+und[w][e]-und[q][e];
				else
					nrp=und[q][e]-und[q][w]-und[e][w]-1;
				if(detu<poz[nrp])
					poz[nrp]=detu;
			}
		}
		for(int k=n;k>=0;--k)
		{
			poz[k]=min(poz[k],poz[k+1]);
			neg[k]=min(neg[k],neg[k+1]);
		}
		FOR(k,0,l)
		if(poz[k]+neg[l-k]<best)
			best=poz[k]+neg[l-k];
	}
	g<<fixed<<setprecision(1)<<(double)best/2;
	return 0;
}