您的位置:首页 > 其它

uva 5108

2016-05-16 11:58 295 查看
 题目:点我看题目

题意:给出一个凸多边形每次询问给出两点要求此两点的连线将此多边形分分割的两个部分面积的最小值

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<list>
#include<vector>
using namespace std;
const int maxn=50010;
struct Node{
double x,y;
}A[maxn];
double sum[maxn];
int main()
{
int n,i,j,k,a,b,q;
bool falg=false;
while(scanf("%d%d",&n,&q),n||q){
if(falg)printf("\n");falg=true;
sum[0]=0.0;
for(i=0;i<n;++i){
scanf("%lf%lf",&A[i].x,&A[i].y);
}
double ans=0;
for(i=0;i<n;++i){
ans=ans+(A[i].x*A[(i+1)%n].y-A[i].y*A[(i+1)%n].x);
sum[i+1]=sum[i]+(A[i].x*A[(i+1)%n].y-A[i].y*A[(i+1)%n].x);
}ans=fabs(ans/2.0);
while(q--){
scanf("%d%d",&a,&b);
double area=sum[b]-sum[a];
area=area+(A[b].x*A[a].y-A[b].y*A[a].x);
area=fabs(area/2.0);
printf("%.1lf\n",min(area,ans-area));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva 5108