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
HINT
Source
这题还是有点厉害的…
一开始感觉是建凸包然后化一化公式但是还是不会做
后来看了Po姐姐题解发现里面有个前缀和Σ( ° △ °|||)︴
PoPoQQQ的题解
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 3010
#define GET (ch>='0'&&ch<='9')
#define LL long long
using namespace std;
int n,cnt;
LL ans;
void in(int &x)
{
char ch=getchar();x=0;
while (!GET) ch=getchar();
while (GET) x=x*10+ch-'0',ch=getchar();
}
struct Point
{
int x,y;
double k;
bool operator <(const Point& a)const { return x==a.x?y<a.y:x<a.x; }
friend Point operator -(Point& a,Point& b) { return (Point){a.x-b.x,a.y-b.y}; }
}s[MAXN],sta[MAXN];
bool cmp(Point a,Point b) { return a.k<b.k; }
int main()
{
in(n);
for (int i=1;i<=n;i++) in(s[i].x),in(s[i].y);
sort(s+1,s+n+1);
for (int i=1;i<=n;i++)
{
cnt=0;
LL sumx=0,sumy=0;
for (int j=i+1;j<=n;j++) sta[++cnt]=s[j]-s[i],sta[cnt].k=sta[cnt].x?(double)sta[cnt].y/sta[cnt].x:1e20;
sort(sta+1,sta+cnt+1,cmp);
for (int j=1;j<=cnt;j++) ans+=sumx*sta[j].y-sumy*sta[j].x,sumx+=sta[j].x,sumy+=sta[j].y;
}
printf("%lld.%d\n",ans>>1,ans&1?5:0);
}