题意:每组给出矩形左上角和右下角坐标,求矩形面积并;
思路:沿水平方向计算面积并;(切成水平条);
#include#include #include #include #include using namespace std;const int maxn=500;struct node{ double x; int l,r,t; //t为上下边标志}f[maxn]; //水平条int n;double q[maxn],x1[maxn],yy1[maxn],x2[maxn],yy2[maxn];//q存储排序后的x坐标struct segment{ int mark; //并区间标志 double len;//并区间长度}tree[maxn*20];//线段树int cmp(node a,node b){ return a.x =lc) ins(k*2,l,(l+r)/2,lc,rc,t); if((l+r)/2 x2[i]) swap(x1[i],x2[i]); if(yy1[i]>yy2[i]) swap(yy1[i],yy2[i]); q[i*2-2]=x1[i]; q[i*2-1]=x2[i];//存储x坐标 } sort(q,q+n*2); int m=unique(q,q+n*2)-q; for(int i=1;i<=n;i++){ //将矩阵i的上边左右端点在q表的指针、y坐标、上边标志存入f[i*2-2];将矩阵i的下边左右端点在q表的指针、y坐标、下边标志存入f[i*2-1] f[i*2-2].l=lower_bound(q,q+m,x1[i])-q; f[i*2-2].r=lower_bound(q,q+m,x2[i])-q; f[i*2-2].x=yy1[i]; f[i*2-2].t=1; f[i*2-1].l=lower_bound(q,q+m,x1[i])-q; f[i*2-1].r=lower_bound(q,q+m,x2[i])-q; f[i*2-1].x=yy2[i]; f[i*2-1].t=-1; } sort(f,f+n*2,cmp); for(int i=0;i