poj 1151 Atlantis / hdu 1542 线段树扫描线 矩形面积并
2012-08-10 21:26
661 查看
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const double EP=1e-8; const int maxn=205; int n, cas=1; double hash[maxn]; struct nod{ double x; int c, id; }a[maxn]; struct node{ int lef, rig, mid, cover; }seg[4*maxn]; struct line{ int x1, x2, flag; //flag==1 down double y; }l[maxn]; void make_tree(int num, int lef, int rig){ seg[num].lef=lef; seg[num].rig=rig; seg[num].mid=(lef+rig)>>1; seg[num].cover=0; if(lef+1!=rig){ make_tree(num<<1, lef, seg[num].mid); make_tree(num*2+1, seg[num].mid, rig); } } void insert(int num, int lef, int rig, int cover){ if(seg[num].cover!=-1&&seg[num].lef==lef&&seg[num].rig==rig){ seg[num].cover+=cover; return; } if(seg[num].cover>0){ insert(num*2, seg[num*2].lef, seg[num*2].rig, seg[num].cover); insert(num*2+1, seg[num*2+1].lef, seg[num*2+1].rig, seg[num].cover); seg[num].cover=-1; } if(rig<=seg[num].mid) insert(num*2, lef, rig, cover); else if(lef>=seg[num].mid) insert(num*2+1, lef, rig, cover); else { insert(num*2, lef, seg[num].mid, cover); insert(num*2+1, seg[num].mid, rig, cover); } } double cal(int num, int cover){ if(seg[num].cover>=cover) return hash[seg[num].rig]-hash[seg[num].lef]; if(seg[num].lef+1==seg[num].rig){ return 0; } return cal(num*2, cover)+cal(num*2+1, cover); } bool cmpx(nod p1, nod p2){ return p1.x<p2.x; } bool cmpid(nod p1, nod p2){ return p1.id<p2.id; } bool cmpy(line l1, line l2){ return l1.y<l2.y; } void myhash(){ int i; sort(a, a+2*n, cmpx); hash[0]=a[0].x; a[0].c=0; for(i=1; i<2*n; i++){ if(a[i].x-a[i-1].x<EP) a[i].c=a[i-1].c; else { a[i].c=a[i-1].c+1; hash[a[i].c]=a[i].x; } } sort(a, a+2*n, cmpid); for(i=0; i<n; i++){ l[i*2].x1=l[i*2+1].x1=a[i*2].c; l[i*2].x2=l[i*2+1].x2=a[i*2+1].c; } } void init(){ for(int i=0; i<n; i++){ scanf("%lf%lf%lf%lf", &a[i*2].x, &l[i*2].y, &a[i*2+1].x, &l[i*2+1].y); l[i*2].flag=1;l[i*2+1].flag=-1; a[i*2].id=i*2;a[i*2+1].id=i*2+1; } } void solve(){ make_tree(1, 0, 2*n); myhash(); sort(l, l+2*n, cmpy); double ans=0; for(int i=0; i<2*n-1; i++){ insert(1, l[i].x1, l[i].x2, l[i].flag); ans+=cal(1, 1)*(l[i+1].y-l[i].y); } printf("Test case #%d\nTotal explored area: %.2f\n\n", cas++, ans); } int main(){ //freopen("1.txt", "r", stdin); while(scanf("%d", &n)&&n){ init(); solve(); } return 0; }
相关文章推荐
- hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]
- hdu 1542 & poj 1151 Atlantis 线段树扫描线求矩形面积并
- 线段树求矩形面积并 方法详解 (扫描线)HDU 1542 & HDU 3265 & POJ 1151
- HDU1542 Atlantis(扫描线+矩形面积并+线段树)
- poj 1151 & hdu 1542 Atlantis(线段树,扫描线)
- POJ 1151 Atlantis(扫描线 + 线段树 矩形面积的并)
- HDU 1542 & POJ 1151 Atlantis【线段树扫描线】
- 【线段树 + 离散化 + 扫描线】poj 1151 Atlantis 矩形面积并
- POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并
- HDU1542——Atlantis(扫描线,线段树,矩形面积并,离散化)
- POJ 1151Atlantis 矩形面积并[线段树 离散化 扫描线]
- 【codevs 3044】【HDU 1542】【poj 1151】矩形面积并 线段树+‘扫描线’
- 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)
- HDU-1542/POJ-1151 Atlantis(矩形并面积--线段树+离散化)
- POJ 1151 & HDU 1542 Atlantis(扫描线模板 线段树 离散化)
- 【codevs 3044 矩形面积合并】【poj 1151 Atlantis】【hdu 1542 Atlantis】题意&题解&代码(c++)
- poj 1151 hdu 1542 Atlantis 线段树扫描线,详细讲解,(*^__^*) 嘻嘻……
- POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并
- HDOJ 1542 (POJ 1151) Atlantis 【线段树 离散化 扫描线 面积并】
- poj 1151 && hdu 1542 求矩形面积并(线段树)