标签:des style blog http color java os io
解题报告
题意:
矩形面积并。
思路:
扫描线+线段树
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> using namespace std; struct Seg { int lx,rx,h,v; friend bool operator < (Seg a,Seg b) { return a.h<b.h; } } seg[500000]; int lz[201000],sum[201000]; void push_up(int rt,int l,int r) { if(lz[rt]) sum[rt]=r+1-l; else if(l==r)sum[rt]=0; else sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void update(int rt,int l,int r,int ql,int qr,int v) { if(ql>r||qr<l)return ; if(ql<=l&&r<=qr) { lz[rt]+=v; push_up(rt,l,r); return ; } int mid=(l+r)>>1; update(rt<<1,l,mid,ql,qr,v); update(rt<<1|1,mid+1,r,ql,qr,v); push_up(rt,l,r); } int main() { int n,i,j,x1,y1,x2,y2,x3,y3,x4,y4; while(~scanf("%d%d%d%d",&x1,&y1,&x2,&y2)) { int m=0; if(x1==y1&&x2==y2&&x1==x2&&x1==-2)break; memset(lz,0,sizeof(lz)); memset(sum,0,sizeof(sum)); seg[m].lx=min(x1,x2);seg[m].rx=max(x1,x2);seg[m].v=1;seg[m++].h=min(y1,y2); seg[m].lx=min(x1,x2);seg[m].rx=max(x1,x2);seg[m].v=-1;seg[m++].h=max(y1,y2); while(~scanf("%d%d%d%d",&x1,&y1,&x2,&y2)) { if(x1==y1&&x2==y2&&x1==x2&&x1==-2)break; if(x1==y1&&x2==y2&&x1==x2&&x1==-1)break; seg[m].lx=min(x1,x2);seg[m].rx=max(x1,x2);seg[m].v=1;seg[m++].h=min(y1,y2); seg[m].lx=min(x1,x2);seg[m].rx=max(x1,x2);seg[m].v=-1;seg[m++].h=max(y1,y2); } sort(seg,seg+m); int ans=0; for(i=0; i<m-1; i++) { update(1,0,100-1,seg[i].lx,seg[i].rx-1,seg[i].v); ans+=sum[1]*(seg[i+1].h-seg[i].h); } printf("%d\n",ans); } return 0; }
5 8 7 10 6 9 7 8 6 8 8 11 -1 -1 -1 -1 0 0 100 100 50 75 12 90 39 42 57 73 -2 -2 -2 -2
8 10000
HDU1377_Counting Squares(扫描线/线段树),布布扣,bubuko.com
HDU1377_Counting Squares(扫描线/线段树)
标签:des style blog http color java os io
原文地址:http://blog.csdn.net/juncoder/article/details/38616219