平面最大三角形面积 Largest Triangle Kattis - largesttriangle
题意:
给定一些点,求出任选三点的最大三角形面积
题解:
首先想到最大的面积应该出现在凸包上。(应该很好猜)
思路:
- 暴力枚举凸包上的任意两点,
- (这个过程不太好描述,看代码ba)可以想到,第三个点是单向的(也就是下标只会增加),
因此复杂度是:\(n^2\)
代码:
#include<bits/stdc++.h>
#define int long long
#define pdd pair<double,double>
#define x first
#define y second
using namespace std;
const int N=5010;
const double eps=1e-8;
int n;
pdd q[N];
int stk[N];
int used[N];
pdd operator-(pdd a, pdd b){
return {a.x-b.x,a.y-b.y};
}
double cross(pdd a,pdd b){
return a.x*b.y-a.y*b.x;
}
double area(pdd a,pdd b,pdd c){
return cross(b-a,c-a);
}
double get_dist(pdd a ,pdd b){
double dx=a.x-b.x;
double dy=a.y-b.y;
return sqrt(dx*dx+dy*dy);
}
double andrew(){
sort(q,q+n);
int top=0;
for(int i=0;i<n;i++){
while(top>=2 && area(q[stk[top-2]],q[stk[top-1]],q[i])<=0){
if(area(q[stk[top-2]],q[stk[top-1]],q[i])==0)
top--;
else
used[stk[--top]]=false;
}
stk[top++]=i;
used[i]=true;
}
used[0]=false;
for(int i=n-1;i>=0;i--){
if(used[i]) continue;
while(top>=2 && area(q[stk[top-2]],q[stk[top-1]],q[i])<=0)
top--;
stk[top++]=i;
}
double ans=0;
for(int i=0;i<top;i++){
int k=(i+2)%top;
for(int j=i+1;j<top;j++){
while(area(q[stk[i]],q[stk[j]],q[stk[k]])<
area(q[stk[i]],q[stk[j]],q[stk[(k+1)%top]]))
k=(k+1)%top;
ans=max(ans,area(q[stk[i]],q[stk[j]],q[stk[k]]));
}
}
return ans;
}
void solve(){
cin>>n;
for(int i=0;i<n;i++) cin>>q[i].x>>q[i].y;
double ans=andrew();
printf("%.5lf\n", ans/2);
}
signed main(){
int t=1;
// cin>>t;
while(t--)
solve();
return 0;
}