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 ...
随机推荐
- 洛谷 P1414 又是毕业季II(未完成)
题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定 ...
- hdu61272017杭电多校第七场1008Hard challenge
Hard challenge Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) ...
- 题解报告:hdu 1015 Safecracker
Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kl ...
- magento getUrl函数跳转admin模块问题
在用以下代码时,跳转后的url里面会是空的,即没有admin这个值 $this->getUrl('admin/catalog_product/edit', array('id' => $c ...
- SpringMVC实现Action的两种方式以及与Struts2的区别
4.程序员写的Action可采用哪两种方式? 第一.实现Controller接口第二.继承自AbstractCommandController接口 5.springmvc与struts2的区别? 第一 ...
- 微信小程序一些常见的坑
1.小程序都报wxss编译错误 解决方法: 在控制台输入openVendor() ,清除里面的wcsc wcsc.exe 然后重启工具 2.微信小程序wx:for警告 Now you can prov ...
- iOS浏览器不能打开手机QQ客服与指定用户聊天界面
这个问题是我在公司需求的时候遇到的,QQ推广工具网站获取的链接在苹果自带浏览器没法打开到聊天界面,是因为safair在打开到app store的时候把参数给丢了,app store再打开到QQ的时候就 ...
- Python之数据规整化:清理、转换、合并、重塑
Python之数据规整化:清理.转换.合并.重塑 1. 合并数据集 pandas.merge可根据一个或者多个不同DataFrame中的行连接起来. pandas.concat可以沿着一条轴将多个对象 ...
- java 8 stream使用
使用stream代替循环的方案 1.定义一个Article类包括标题.作者.标签 private class Article { private final String title; private ...
- 关于使用Axis2 webservice 处理Fault响应时抛org.apache.axis2.AxisFault的分析
使用Axis2这个框架进行webservice协议通讯,期间出了个问题,我(CLIENT)请求后,当服务端返回符合协议的SOAP异常报文,例如<soap:fault> ... 我的程序直接 ...