#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<ctime>
#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
#include<list>
#include<bitset>
#include<sstream>
#include<fstream>
#include<complex>
#include<algorithm>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
struct sut{
double x,y;
}a[100010];
bool cmp(sut a,sut b){
return a.x<b.x;
}
double area(int p1,int p2,int p3){
return 0.5*fabs((a[p2].x-a[p1].x)*(a[p3].y-a[p2].y)-(a[p3].x-a[p2].x)*(a[p2].y-a[p1].y));
}
bool pos(int p1,int p2,int p3){
int m=(a[p2].x-a[p1].x)*(a[p3].y-a[p2].y)-(a[p3].x-a[p2].x)*(a[p2].y-a[p1].y);
if(m>0) return 1;
else return 0;
}
double res=0;
void cal(bool pos1,int p1,int p2){
int p=-1;
double m=-1;
for(int i=p1+1;i<p2;i++){
if(pos1==pos(p1,p2,i)) continue;
if(area(p1,p2,i)>m){
m=area(p1,p2,i);
p=i;
}
}
if(p==-1) return;
res+=m;
cal(pos1,p1,p);
cal(pos1,p,p2);
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
}
sort(a+1,a+1+n,cmp);
cal(1,1,n);
cal(0,1,n);
printf("%.1lf\n",res);
res=0;
}
return 0;
}
[凸包面积板子]
最新推荐文章于 2024-06-13 14:15:10 发布