和HDU 1255差不多
这次是求只被覆盖一次的矩形面积和
修改callen函数即可
data[k].len表示被覆盖的纵长度
data[k].key表示被只被覆盖一次的纵长度
#include "stdio.h" #include "string.h" #include "stdlib.h" #include "math.h" #include "iostream" #include "algorithm" using namespace std; struct comp { int flag; // 1代表矩阵的起始边,-1代表矩阵的终边 int x,y1,y2; } node[200010]; // 记录每条与Y轴平行的边 struct comp1 { int l,r,mid,s; int len,ml,mr,key; } data[800010]; bool cmp(comp a,comp b) { return a.x<b.x; } int y[200010]; void build(int l,int r,int k) { data[k].l=l; data[k].r=r; data[k].mid=(l+r)/2; data[k].ml=y[l]; data[k].mr=y[r]; data[k].s=data[k].len=0; if (l+1==r) return ; build(l,data[k].mid,k*2); build(data[k].mid,r,k*2+1); // 注意应该从 mid开始 } void callen(int k) // 计算纵长度 { if (data[k].s>1) { data[k].len=data[k].mr-data[k].ml; data[k].key=0; } else if (data[k].s==1) { data[k].len=data[k].mr-data[k].ml; if (data[k].l+1==data[k].r) data[k].key=data[k].len; else data[k].key=data[k].len-data[k*2].len-data[k*2+1].len; } else if (data[k].l+1==data[k].r) { data[k].len=0; data[k].key=0; } else { data[k].len=data[k*2].len+data[k*2+1].len; data[k].key=data[k*2].key+data[k*2+1].key; } } void updata(int k,comp b) { if (b.y1==data[k].ml && b.y2==data[k].mr) { data[k].s+=b.flag; callen(k); return ; } if (b.y2<=data[k*2].mr) updata(k*2,b); else if (b.y1>=data[k*2+1].ml) updata(k*2+1,b); else { comp temp; temp=b; temp.y2=data[k*2].mr; updata(k*2,temp); temp=b; temp.y1=data[k*2+1].ml; updata(k*2+1,temp); } callen(k); } int main() { int n,i,t,p,Case; int x1,x2,y1,y2; long long sum; scanf("%d",&Case); for (p=1;p<=Case;p++) { scanf("%d",&n); t=1; for (i=0;i<n;i++) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); node[t].x=x1; node[t].y1=y1; node[t].y2=y2; node[t].flag=1; y[t++]=y1; node[t].x=x2; node[t].y1=y1; node[t].y2=y2; node[t].flag=-1; y[t++]=y2; } sort(node+1,node+t,cmp); sort(y+1,y+t); build(1,t-1,1); sum=0; updata(1,node[1]); for (i=2;i<t;i++) { sum+=(long long )data[1].key*(node[i].x-node[i-1].x); updata(1,node[i]); } printf("Case %d: %lld\n",p,sum); } return 0; }
原文:http://blog.csdn.net/u011932355/article/details/44538849