#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;
typedef struct
{
double x;
double y;
}point;
point chs[50001],a[50001];
int sp,N,Q;
double s[50001];
double dis(point a, point b)
{
return sqrt((a.x - b.x) * (a.x - b.x) * 1.0 + (a.y - b.y) * (a.y - b.y));
}
double multi(point p0, point p1, point p2)
{
return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
}
double findarea(int n)
{
int i;
double area;
area = 0.;
for(i=1; i<n-1; i++) //求面积
{
double k = multi(a[0], a[i], a[i+1]); //三角形面积是向量叉积的1/2
area += k;
s[i+1]=fabs(area)/2;
}
area = fabs(area) / 2;
return area;
}
int main()
{
int i,l,r,j;
double ans,anss,sum;
scanf("%d%d",&N,&Q);
s[0]=s[1]=0;
for (i=0;i<N;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
sum=findarea(N);
for (i=1;i<=Q;i++)
{
cin >> l >> r;
ans=s[r]-s[l]-fabs(multi(a[0], a[l], a[r]))/2;
anss=sum-ans;
if (ans>anss)
ans=anss;
printf("%.1f\n",ans);
}
return 0;
}
模板 求凸包面积
最新推荐文章于 2021-03-17 16:58:47 发布