题目
思路
我的天哪这个题的精度是真要命啊调了一大天一口老血喷出来
思想:扫描线
将三角形每个顶点及各个三角形的交点横坐标存起来 每次计算每一竖条的贡献
每条贡献:(左边界所占长度 + 右边界所占长度)/ 2
重点细节在于找与边界的交点,情况如下:
①完全不在当前这一条里的
②三角形的一条边刚好和左|右边界重合 根据左右以及点(0,1)||(1,2)来讨论 这里每个三角形的三个点前面都按横坐标排好序了
③一般情况,求出三角形与边界的所有交点(2||3个) 3个即△的一个顶点刚好落在边界上,然后排序求出此区间的范围
最后对这些区段合并计入贡献
注意求交点里面判断点是否在Seg上的函数只写Dot就好了!别多写多写精度过不去!还有eps貌似只能1e-8!
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const double eps = 1e-6;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const int MaxN = 105;
int n;
vector<double> G;
struct Poin