首先平面图转对偶图,大概思路是每条边存正反,每个点存出边按极角排序,然后找每条边在它到达点的出边中极角排序的下一个,这样一定是这条边所属最小多边形的临边,然后根据next边找出所有多边形,用三角剖分计算面积
然后就比较妙了,把对偶图随便搞一个生成树出来,然后对于每个询问,如果一条边是树边,那么如果这条边在树上是向上的就加它子树的和,否则就减#include#include #include #include #include using namespace std;const int N=2000005;int n,m,k,cnt=1,tot,rt,a[N],fa[N],ne[N],c[N];long long s1[N],s2[N],ans1,ans2;bool v[N],vis[N];struct dian{ double x,y; dian(double X=0,double Y=0) { x=X,y=Y; } dian operator + (const dian &a) const { return dian(x+a.x,y+a.y); } dian operator - (const dian &a) const { return dian(x-a.x,y-a.y); }}p[N];struct bian{ int x,y,id; double a; bian(int X=0,int Y=0,int ID=0) { x=X,y=Y,id=ID,a=atan2(p[y].y-p[x].y,p[y].x-p[x].x); } bool operator < (const bian &b) const { return a f[N],g[N];int read(){ int r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f;}double cj(dian a,dian b){ return a.x*b.y-a.y*b.x;}long long gcd(long long a,long long b){ return !b?a:gcd(b,a%b);}void dfs(int u){ vis[u]=1; for(int i=0;i >=1; printf("%lld %lld\n",ans1,ans2); } return 0;}