题解 P3476 【[POI2008]TRO-Triangles】
似乎其他两篇题解都说得不太清楚的样子,那我写一篇好懂一点的吧。
首先使用assert,测出
我们考虑三个点
那我们为了不暴力统计,考虑依次固定一个点,比如
但这就产生一个问题:如果其他点相对
然后我们依次考虑所有点作为点
总时间复杂度为
#include<iostream>
#include<algorithm>
#include<cctype>
#include<cstdio>
using namespace std;
typedef long long ll;
inline ll readint(){
ll x=0;
char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)){
x=x*10+c-'0';
c=getchar();
}
return x;
}
struct Point{
ll x,y;
Point(int x=0,int y=0):x(x),y(y){}
};
typedef Point Vector;
inline Point readpoint(){
Point p;
p.x=readint();
p.y=readint();
return p;
}
Vector operator -(Vector a,Vector b){
return Vector(a.x-b.x,a.y-b.y);
}
inline ll cross(Vector a,Vector b){
return a.x*b.y-b.x*a.y;
}
int n;
const int maxn=3000+5;
Point p[maxn];
bool cmp1(Point a,Point b){
return a.y<b.y||(a.y==b.y&&a.x<b.x);
}
Point p2[maxn];
Point aa;
bool cmp2(Point a,Point b){
return cross(a-aa,b-aa)>0;
}
ll ans=0;
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
n=readint();
for(int i=0;i<n;i++) p[i]=readpoint();
sort(p,p+n,cmp1);
for(int i=0;i<n;i++){
aa=p[i];
for(int j=i+1;j<n;j++) p2[j]=p[j];
sort(p2+i+1,p2+n,cmp2);
ll sx=0,sy=0;
for(int j=n-1;j>i;j--){
ans+=aa.x*(p2[j].y*(n-j-1)-sy)+aa.y*(sx-p2[j].x*(n-j-1))+p2[j].x*sy-sx*p2[j].y;
sx+=p2[j].x;
sy+=p2[j].y;
}
}
if(ans%2==1) cout<<ans/2<<".5"<<endl;
else cout<<ans/2<<".0"<<endl;
return 0;
}