省选专练[POI2008]TRO-Triangles

12 篇文章 0 订阅
11 篇文章 0 订阅

首先朴素算法极为简单

n^3对吧

然后思考挂上log

排序

然后枚举第一个点

接着再按向量位置关系越靠右越好排序

接着维护一个向量后缀和就完了。

但是这个题卡精度。

long double 就好了 

#include<bits/stdc++.h>
using namespace std;
const int N=3e4;
#define lb long double
const lb eps=1e-21;
const lb INF=1e21;
int cmp(lb A){
	if(fabs(A)<eps)return 0;
	else return (A>0)?1:-1; 
}
int equal(lb A,lb B){
	return (cmp(A-B)==0);
}
struct Point{
	lb x,y;
	Point(lb _x=0,lb _y=0):x(_x),y(_y){}
	friend Point operator + (Point A,Point B) {return Point(A.x+B.x,A.y+B.y);}
	friend Point operator - (Point A,Point B) {return Point(A.x-B.x,A.y-B.y);}
	friend Point operator * (Point A,lb k){return Point(A.x*k,A.y*k);}
	friend Point operator / (Point A,lb k){return Point(A.x/k,A.y/k);}
	lb ang(){return atan2(y,x);}
	void read(){scanf("%Lf%Lf",&x,&y);}
}p[N],tmp[N];
int top=0;
lb Cross(Point A,Point B){
	return (A.x*B.y-A.y*B.x);
}
bool cmpCross(Point A,Point B){
	return(cmp(Cross(A,B))>0);
}
bool cmpheight(Point A,Point B){
	return A.y<B.y||(A.y==B.y&&A.x<B.x);
}
int n;
lb ans=0;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		p[i].read();
	}
	sort(p+1,p+1+n,cmpheight);
	for(int i=1;i<=n;i++){
		top=0;
		for(int j=i+1;j<=n;j++){
			tmp[++top]=p[j]-p[i];
		}	
		sort(tmp+1,tmp+1+top,cmpCross);
		Point sum=Point(0,0);
		for(int j=top;j>=1;j--){
			ans+=Cross(sum,tmp[j]);
			sum=sum-tmp[j];
		}
	}
	printf("%.1Lf",ans/2);
//	cout<<ans/2;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值