⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2313617_tle.cpp

📁 北大大牛代码 1240道题的原代码 超级权威
💻 CPP
字号:
# include <stdio.h>
# include <math.h>
# include <algorithm>
# define MAX 100010
using namespace std;

typedef long stack;
struct node
{
	double x, y;
}Q[MAX];

long n, low;
double lowx, lowy;
stack p, s[MAX];

bool cmp(struct node a,struct node b)
{
	if(a.x==lowx&&a.y==lowy)
		return 1;
	if(b.x==lowx&&b.y==lowy)
		return 0;
	if((a.x-lowx)*(b.y-lowy)==(b.x-lowx)*(a.y-lowy))
		return (a.x-lowx)*(a.x-lowx)+(a.y-lowy)*(a.y-lowy)<(b.x-lowx)*(b.x-lowx)+(b.y-lowy)*(b.y-lowy);
	return (a.x-lowx)*(b.y-lowy)-(b.x-lowx)*(a.y-lowy) > 0;
}

void GRAHAM_SCAN()
{
	long i;

	s[0] = 0;
	i = 1;
	while(i<n-1&&(Q[i].x-lowx)*(Q[i+1].y-lowy)==(Q[i+1].x-lowx)*(Q[i].y-lowy))
		i++;
	s[1] = i++;s[2] = i++;
	p = 2;
	while(i < n)
	{	
		if(i<n-1&&(Q[i].x-lowx)*(Q[i+1].y-lowy)==(Q[i+1].x-lowx)*(Q[i].y-lowy))
		{
			i++;
			continue;
		}
		while((Q[s[p-1]].x-Q[s[p]].x)*(Q[i].y-Q[s[p]].y)>=(Q[i].x-Q[s[p]].x)*(Q[s[p-1]].y-Q[s[p]].y))
			p--;
		s[++p] = i;
		i++;
	}
}

double cal(long a,long b,long c)
{
	long i;
	double S = 0, S1 = 0;
	stack q, tmp[MAX];
	double A, B, C, P;

	A = sqrt((Q[s[a]].x-Q[s[b]].x)*(Q[s[a]].x-Q[s[b]].x)+(Q[s[a]].y-Q[s[b]].y)*(Q[s[a]].y-Q[s[b]].y));
	B = sqrt((Q[s[a]].x-Q[s[c]].x)*(Q[s[a]].x-Q[s[c]].x)+(Q[s[a]].y-Q[s[c]].y)*(Q[s[a]].y-Q[s[c]].y));
	C = sqrt((Q[s[c]].x-Q[s[b]].x)*(Q[s[c]].x-Q[s[b]].x)+(Q[s[c]].y-Q[s[b]].y)*(Q[s[c]].y-Q[s[b]].y));
	P = (A+B+C)/2.0;
	S = sqrt(P*(P-A)*(P-B)*(P-C));
	tmp[1] = s[a--];
	if(a<0)
		a = p;
	tmp[0] = s[a];
	tmp[2] = tmp[1]+1;
	tmp[2]%=n;
	if(tmp[2]==s[b])
		tmp[2]++,tmp[2]%=n;
	q = 2;
	a = tmp[2]+1;a%=n;
	while(a<=s[c])
	{
		while((Q[tmp[q-1]].x-Q[tmp[q]].x)*(Q[a].y-Q[tmp[q]].y)>=(Q[a].x-Q[tmp[q]].x)*(Q[tmp[q-1]].y-Q[tmp[q]].y))
			q--;
		s[++q] = a;
		a++;
		a%=n;
	}
	if(q>3)
	{
		for(i = 1; i <= q; i++)
		{
			a = i+1;
			if(a==q+1)
				a = 1;
			S1 += -0.5*(Q[tmp[i]].x * Q[tmp[a]].y - Q[tmp[i]].y*Q[tmp[a]].x);
		}
		if(S1<0)
			S1 *= -1;
	}
	return S-S1;
}

int input()
{
	long i;
	double S, min, tmp;
	long a, b;

	scanf("%ld",&n);
	if(!n)
		return 0;
	low = 0;
	for(i = 0; i < n; i++)
	{
		scanf("%lf%lf",&Q[i].x,&Q[i].y);
		if(i)
		{
			if(Q[i].y < Q[low].y||(Q[i].y == Q[low].y&&Q[i].x<Q[low].x))
				low = i;
		}
	}
	lowx = Q[low].x; lowy = Q[low].y;
	sort(Q,Q+n,cmp);
	GRAHAM_SCAN();
	S = 0;
	for(i = 0; i <= p; i++)
		S += -0.5*(Q[s[i]].x * Q[s[(i+1)%(p+1)]].y - Q[s[i]].y*Q[s[(i+1)%(p+1)]].x);
	if(S<0)
		S *= -1;
	min = S;
	for(i = 0; i <= p; i++)
	{
		a = i-1;b = i+1;
		if(a<0)
			a = p;
		if(b==p+1)
			b = 0;
		if((tmp=S-cal(a,i,b))<min)
			min = tmp;
	}
	printf("%.2lf\n",min);
	return 1;
}

int main()
{
	while(input());
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -