【HDU】1542 Atlantis 矩形面积并->线段树
来源:互联网 发布:php项目开发实战入门 编辑:程序博客网 时间:2024/05/29 18:08
http://acm.hdu.edu.cn/showproblem.php?pid=1542
给出n个矩形的左下角和右上角的坐标,求矩形面积的并
#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <queue>#include <map>#include <algorithm>using namespace std;const int maxn=1005;int n;double Y[maxn*2];struct Line{ double x; //横坐标的值 double y1,y2;//纵坐标区间 int flag; //flag==1时表示他是长方形左边;flag==-1时,表示他是长方形右边 }line[maxn*2];struct Node{ double x; //最新到过该节点的线对应的x double left,right; //左边界、右边界 bool sign; //标记该节点是否是叶子节点 int cover; //覆盖值 }node[maxn<<3];///这里不能使MAXN左移两位,因为有N个矩形,对应2*N个线段,则应该是2*N左移2位。 bool cmp(struct Line a,struct Line b){ return a.x<b.x;}void Build(int root,int l,int r){ node[root].left=Y[l]; node[root].right=Y[r]; node[root].x=-1; node[root].sign=false; //说明该节点不是叶子节点 node[root].cover=0; if (r-l==1){ node[root].sign=true; //是叶子节点 return; } int mid=(l+r)>>1; Build(root<<1,l,mid); Build(root<<1|1,mid,r);}///参数含义,root为节点,line_x代表当前线对应的横坐标,l下界,r上界 ///flag代表当前的线是长方形的左侧的边还是右侧的边 double Calculate(int root,double line_x,double l,double r,int flag){ if (r<=node[root].left||l>=node[root].right){ return 0; } if (node[root].sign){ //如果是叶子节点 if (node[root].cover>0){ double pre=node[root].x; double ans=(line_x-pre)*(node[root].right-node[root].left); node[root].x=line_x; node[root].cover+=flag; return ans; } else{ node[root].x=line_x; node[root].cover+=flag; return 0; } } double ans1=Calculate(root<<1,line_x,l,r,flag); double ans2=Calculate(root<<1|1,line_x,l,r,flag); return ans1+ans2;}int main(){ long long a,b,c,d; while (cin >> n && n){ int num=0; for (int i=0;i<n;i++){ cin >> a >> b >> c >> d; Y[num]=b; line[num].x=a; line[num].y1=b; line[num].y2=d; line[num].flag=1; num++; Y[num]=d; line[num].x=c; line[num].y1=b; line[num].y2=d; line[num].flag=-1; num++; } sort(Y,Y+num); sort(line,line+num,cmp); Build(1,0,num-1); long long union_area=0; for (int i=0;i<num;i++){ union_area+=Calculate(1,line[i].x,line[i].y1,line[i].y2,line[i].flag); } cout << union_area << endl; } cout << "*" << endl;}
阅读全文
0 0
- hdu 1542(线段树 求矩形面积并)Atlantis
- Hdu 1542 Atlantis 线段树 求矩形面积并
- Hdu 1542/ POj 1151 Atlantis 线段树+矩形面积并
- HDU 1542 Atlantis(线段树求矩形面积并)
- hdu 1542 Atlantis 线段树矩形面积并+离散化
- HDU 1542 Atlantis(线段树求矩形面积并)
- hdu 1542 Atlantis (线段树求矩形面积并)
- 【HDU】1542 Atlantis 矩形面积并->线段树
- Hdu 1542 Atlantis + Hdu 1255 覆盖的面积 (线段树矩形面积并)
- 【HDU1542】Atlantis【线段树】【矩形面积并】
- hdu1542 Atlantis【矩形面积并+线段树】
- poj 1151 hdu 1542 hoj1119 Atlantis 线段树扫描线求矩形面积并
- poj 1151 Atlantis / hdu 1542 线段树扫描线 矩形面积并
- hdu 1542 (poj1151) Atlantis ( 线段树求矩形面积并)
- hdu 1542 Atlantis 线段树+矩形面积并+离散化点
- POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并
- hdu 1542 Atlantis(线段树进阶,扫描线,矩形面积并)
- POJ1151 (HDU 1542) Atlantis【矩形面积并,线段树+离散化+扫描线模板】
- Cable master(二分查找)
- 轻量级插件sdstorage用于操作localStorage支持过期、批量搜索删除等
- 动态背景页面登录--(软件实训)
- freeCodeCamp-jQuery
- 编译原理学习笔记·语法分析(LL(1)分析法/算符优先分析法OPG)及例子详解
- 【HDU】1542 Atlantis 矩形面积并->线段树
- HDU-整除的尾数
- Java设计模式
- C++实例 静态成员的引入——静态数据成员的定义、调用,静态成员函数的实现、调用。
- 1042. Shuffling Machine (20)
- HDU 2722 Here We Go(relians) Again
- hive-4
- jstl、struts2取值问题
- 作业3.4