DES:顺时针给出构成凸多边形的点。然后有Q个询问任意给出两个点的编号,询问由这两个点的连线将多边形分成的两部分面积较小的部分面积大小。
比赛时直接每次连线后求多边形求面积超时了。正确解法是求出利用叉积球三角形面积不断求和求出多边形总面积的同时,保留多边形的前缀和。当任意两点连线时,只要用前缀和想减再减去一个三角形的面积即可。
然而...我不理解的是关于q的那个循环...for就是超时...while就是AC...坐标明明是interger...int就WA...double就AC...
#include<stdio.h> #include<string.h> #include<iostream> #include<math.h> using namespace std; struct Point { double x, y; } p[50010]; double areaa(Point p0, Point p1, Point p2) //计算以这三个点为顶点的三角形面积 { double temp = (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); temp /= 2.0; return fabs(temp); } double area[50010]; // 存储多边形的前缀多边形的面积。 int main() { int n, q; int xx, yy; while(~scanf("%d%d", &n, &q)) { for (int i=0; i<n; ++i) { scanf("%lf%lf", &p[i].x, &p[i].y); } double tot_area = 0; area[0] = 0; area[1] = 0; for (int i=1; i<n-1; ++i) { tot_area += areaa(p[0], p[i], p[i+1]); area[i+1] = tot_area; } int t1, t2; double ans; double temp_area; while(q--) { scanf("%d%d", &t1, &t2); if (t2 > t1) swap(t1, t2); // 保证t1>t2 temp_area = area[t1]-area[t2]-areaa(p[0], p[t1], p[t2]); if (temp_area < tot_area-temp_area) printf("%.1lf\n", temp_area); else printf("%.1lf\n", tot_area-temp_area); } } return 0; }
L哦哦K
时间: 2024-10-19 11:15:57