HDU 1542 Atlantics 线段树+离散化扫描
将 x 轴上的点进行离散化,扫描线沿着 y 轴向上扫描
每次添加一条边不断找到当前状态有效边的长度 , 根据这个长度和下一条边形成的高度差得到一块合法的矩形的面积
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const int MAX=+;
int flag[MAX<<];//记录某个区间的下底边个数
double sum[MAX<<];//记录某个区间的下底边总长度
double x[MAX];//对x进行离散化,否则x为浮点数且很大无法进行线段树 struct Seg{//线段
double x1,x2,y;
int d;
Seg(){}
Seg(double x1 , double x2 , double y , int d):x1(x1),x2(x2),y(y),d(d){}
bool operator<(const Seg &a)const{
return y<a.y;
}
}s[MAX]; void updateCur(int n,int left,int right){
if(flag[n]) sum[n] = x[right+] - x[left];//表示该区间整个线段长度可以作为底边
else if(left == right) sum[n] = ;//叶子结点则底边长度为0(区间内线段长度为0)
else sum[n] = sum[n<<] + sum[n<<|];
} void update(int o , int l , int r , int s , int t , int d){
if(s<=l && r<=t){//该区间是当前扫描线段的一部分,则该区间下底边总长以及上下底边个数差更新
flag[o] += d;//更新底边相差差个数
updateCur(o , l , r);//更新底边长
return;
}
int mid = (l + r)>> , ls = o<< , rs = o<<|;
if(mid >= s) update(ls , l , mid , s , t , d);
if(mid+ <= t) update(rs , mid+ , r , s , t , d);
updateCur(o , l , r);
} int bin_search(double key , int n){
int l = , r = n-;
while(l<=r){
int mid = (l+r) >>;
if(x[mid] == key) return mid;
if(x[mid] > key) r=mid-;
else l=mid+;
}
return -;
} int main()
{
// freopen("a.in" , "r" , stdin);
int n,cas=;
double x1,x2,y1,y2;
while(scanf("%d" , &n) , n){
int k=;
for(int i=;i<n;++i){
cin>>x1>>y1>>x2>>y2;
x[k]=x1;
s[k++]=Seg(x1,x2,y1,);
x[k]=x2;
s[k++]=Seg(x1,x2,y2,-);
}
sort(x,x+k);
sort(s,s+k);
int t = unique(x , x+k) - x;
double ans=; for(int i=;i<k;++i){//扫描线段
int pos1 = bin_search(s[i].x1 , t);
/*
这里因为是把它理解成合法线段,所以最右端第 i 个点 , 对应第 i - 1条边
同样道理,在updateCur中,计算有效线段长度时 , 需要x[r+1]
*/
int pos2 = bin_search(s[i].x2 , t)-;
update( , , t- , pos1 , pos2 , s[i].d);//扫描线段时更新底边长度和底边相差个数
ans += sum[]*(s[i+].y-s[i].y);//新增加面积
}
printf("Test case #%d\nTotal explored area: %.2lf\n\n",++cas,ans);
}
return ;
}
HDU 1542 Atlantics 线段树+离散化扫描的更多相关文章
- POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并
题意:给出矩形两对角点坐标,求矩形面积并. 解法:线段树+离散化. 每加入一个矩形,将两个y值加入yy数组以待离散化,将左边界cover值置为1,右边界置为2,离散后建立的线段树其实是以y值建的树,线 ...
- HDU 1542 Atlantis (线段树 + 扫描线 + 离散化)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1542 - Atlantis - [线段树+扫描线]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- hdu 1542 Atlantis(线段树,扫描线)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 4325-Flowers(线段树+离散化)
题意: 给出每个花开花的时间段,每询问一个时间点输出该时间点开花的数量 分析: 线段树的区间更新,单点查询,但发现时间很大,没法存区间,就想到了离散化. 离散化就是把要处理的数据统一起来重新标号. # ...
- HDU 1542 Atlantis(线段树面积并)
描述 There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. S ...
- POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算
求n个图矩形放下来,有的重合有些重合一部分有些没重合,求最后总的不规则图型的轮廓长度. 我的做法是对x进行一遍扫描线,再对y做一遍同样的扫描线,相加即可.因为最后的轮廓必定是由不重合的线段长度组成的, ...
- hdu 1542 Atlantis (线段树扫描线)
大意: 求矩形面积并. 枚举$x$坐标, 线段树维护$[y_1,y_2]$内的边是否被覆盖, 线段树维护边时需要将每条边挂在左端点上. #include <iostream> #inclu ...
- Atlantis HDU - 1542 (线段树扫描线)
There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...
随机推荐
- bzoj 4756: [Usaco2017 Jan]Promotion Counting【dfs+树状数组】
思路还是挺好玩的 首先简单粗暴的想法是dfs然后用离散化权值树状数组维护,但是这样有个问题就是这个全局的权值树状数组里并不一定都是当前点子树里的 第一反应是改树状数组,但是显然不太现实,但是可以这样想 ...
- P3573 [POI2014]RAJ-Rally
传送门 很妙的思路 首先这是一个DAG,于是我们先在原图和反图上各做一遍,分别求出\(diss_i\)和\(dist_i\)表示从\(i\)点出发的最短路和以\(i\)为终点的最短路 我们考虑把点分为 ...
- 小记 vue 打包(build)需要注意的一些事
记录 vue 项目打包的一些事情 首先声明项目都是由 vue-cli 生成; vue 项目从 dev 切换到 prod 时有很多地方需要注意; 首先是大家最需要注意的 ajax 切换环节 以前一开始用 ...
- vim 跳行查看日志
VIM 跳跃行号 一.显示行号 在命令模式下输入 :set nu 或者 :set number 即可显示行号 二.跳跃行号 在编辑模式下输入 ngg 或者 nG [n为指定的行数(如25)] ...
- Traceback (most recent call last): File "setup.py", line 22, in <module> execfile(join(CURDIR, 'src', 'SSHLibrary', 'version.py')) NameError: name 'execfile' is not defined
在python3环境下安装robotframework-SSHLibraray报错: Traceback (most recent call last): File "setup.py&qu ...
- web api 二
接着上一回说,上回说到,web api有几种访问方式,具体有几种,我还真没去研究过,但是这里打算从get.post.put.delete四种请求方式分别谈谈基础类型(包括int/string/date ...
- EditText(1)EditText的类型和回车键的行为
1,常见类型 <EditText android:id="@+id/email_address" android:layout_width="fill_parent ...
- redis 配置多个ip 解决方案
因为在 redis 中bind 指定的ip 其实为同一网段或localhost 监听ip,在这里配置 内网其他网段或者外网多个ip 后 重启 redis 是不会成功的, 这边建议使用 折中方案,开通 ...
- LN : leetcode 406 Queue Reconstruction by Height
lc 406 Queue Reconstruction by Height 406 Queue Reconstruction by Height Suppose you have a random l ...
- 记一个java.lang.NoClassDefFoundError的问题
如题,即找不到对应class,出现这个问题,很可能是文件路径配置错误,也可能是jar包丢失. 比如我今天遇到的问题,就是IDEA没有把mybatis的jar包复制到编译目录造成的.