Description
平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000
Input
第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10000]
Output
保留一位小数,误差不超过0.1
Sample Input
5
0 0
1 2
0 2
1 0
1 1
Sample Output
7.0
对于这道题,首先可以发现选择了第个点时的答案,设,则,所以可以通过排序将绝对值去掉,然后就可以用前缀和解决,下面时程序:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#define ll long long
using namespace std;
const int N=3005;
struct Point{
ll x,y;
ll operator *(const Point &p)const{
return x*p.y-y*p.x;
}
bool operator <(const Point &p)const{
return (*this)*p>0;
}
Point operator +(const Point &p)const{
return (Point){x+p.x,y+p.y};
}
Point operator -(const Point &p)const{
return (Point){x-p.x,y-p.y};
}
}p[N],t[N];
int n;
template<typename T>
void read(T &s){
s=0;
char c=getchar();
while(c<'0'||c>'9'){
c=getchar();
}
while(c>='0'&&c<='9'){
s=s*10+c-'0';
c=getchar();
}
}
bool cmp(const Point &a,const Point &b){
return a.y==b.y?a.x<b.x:a.y<b.y;
}
int main(){
int i,j,m;
ll ans=0;
Point tp;
read(n);
for(i=1;i<=n;i++){
read(p[i].x);
read(p[i].y);
}
sort(p+1,p+n+1,cmp);
for(i=1;i<=n-2;i++){
m=tp.x=tp.y=0;
for(j=i+1;j<=n;j++){
t[++m]=p[j]-p[i];
}
sort(t+1,t+m+1);
for(j=1;j<=m;j++){
tp=tp+t[j];
}
for(j=1;j<=m;j++){
tp=tp-t[j];
ans+=t[j]*tp;
}
}
printf("%lld",ans/2);
putchar('.');
putchar(ans&1?'5':'0');
return 0;
}