HDU 1542.Atlantis-线段树求矩形面积并(离散化、扫描线/线段树)-贴模板
好久没写过博客了,这学期不是很有热情去写博客,写过的题也懒得写题解。现在来水一水博客,写一下若干年前的题目的题解。
Atlantis
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 21978 Accepted Submission(s): 8714
The input file is terminated by a line containing a single 0. Don’t process it.
Output a blank line after each test case.
10 10 20 20
15 15 25 25.5
0
Total explored area: 180.00
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e4+;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 int cnt[maxn<<];
double sum[maxn<<],f[maxn]; void init()
{
memset(cnt,,sizeof cnt);
memset(sum,,sizeof sum);
} struct node{
double h,l,r;
int s; node(){} node(double a,double b,double c,int d):l(a),r(b),h(c),s(d){} bool operator<(const node&cmp){
return h<cmp.h;
} }line[maxn]; void pushup(int rt,int l,int r)
{
if(cnt[rt]){//解决线段重复问题,如果当前区间有标记,那么就用f数组进行更新,不是左右儿子更新
sum[rt]=f[r+]-f[l];
}
else if(l==r){
sum[rt]=;
}
else{
sum[rt]=sum[rt<<]+sum[rt<<|];
}
} void update(int L,int R,int c,int l,int r,int rt)
{
if(L<=l&&r<=R){
cnt[rt]+=c;
pushup(rt,l,r);
return ;
} int m=(l+r)>>;
if(L<=m) update(L,R,c,lson);
if(R> m) update(L,R,c,rson);
pushup(rt,l,r);
} int main()
{
int n,cas=;
while(~scanf("%d",&n)&&n){
int h=;
for(int i=;i<=n;i++){//从下往上扫
double a,b,c,d;
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
f[h]=a;
line[h++]=node(a,c,b,);//标记入边
f[h]=c;
line[h++]=node(a,c,d,-);//标记出边
}
sort(f,f+h);
sort(line,line+h);
int d=unique(f,f+h)-f;//离散化
init();
double ret=;
for(int i=;i<h-;i++){//因为每一个点代表的是线段,0代表0-1这一段,所以是查询的时候-1
int l=lower_bound(f,f+d,line[i].l)-f;//直接用下标进行操作
int r=lower_bound(f,f+d,line[i].r)-f;
r--;//因为线段树上点代表线段,从i到i+1这一段,所以查询的时候,右边要-1
if(l<=r) update(l,r,line[i].s,,d-,);
ret+=sum[]*(line[i+].h-line[i].h);
}
printf("Test case #%d\n",cas++);
printf("Total explored area: %.2f\n\n",ret);
}
return ;
}
开溜。
HDU 1542.Atlantis-线段树求矩形面积并(离散化、扫描线/线段树)-贴模板的更多相关文章
- HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)
链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...
- POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并
题意:给出矩形两对角点坐标,求矩形面积并. 解法:线段树+离散化. 每加入一个矩形,将两个y值加入yy数组以待离散化,将左边界cover值置为1,右边界置为2,离散后建立的线段树其实是以y值建的树,线 ...
- POJ 1151 Atlantis 线段树求矩形面积并 方法详解
第一次做线段树扫描法的题,网搜各种讲解,发现大多数都讲得太过简洁,不是太容易理解.所以自己打算写一个详细的.看完必会o(∩_∩)o 顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中, ...
- 【hdu1542】线段树求矩形面积并
分割线内容转载自http://hzwer.com/879.html ------------------------------------------------------------------ ...
- 【hdu1255】线段树求矩形面积交
题意大概就是上图这个样子.<=100组测试数据,每组<=1000个矩形. 题解: 这个问题怎么解决..做了上一题矩形面积并应该就会了.. 对于每个节点维护3个值: cnt:该节点所代表的这 ...
- POJ 1151Atlantis 扫描线+线段树求矩形面积并
题目链接 #include <iostream> #include <vector> #include <cstdio> #include <cstring& ...
- hdu1255 覆盖的面积 线段树+里离散化求矩形面积的交
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 求矩形面积的交的线段树题目,刚做了求并的题目,再做这个刚觉良好啊,只要再加一个表示覆盖次数大于1 ...
- UVA 11983 Weird Advertisement --线段树求矩形问题
题意:给出n个矩形,求矩形中被覆盖K次以上的面积的和. 解法:整体与求矩形面积并差不多,不过在更新pushup改变len的时候,要有一层循环,来更新tree[rt].len[i],其中tree[rt] ...
- (HDU 1542) Atlantis 矩形面积并——扫描线
n个矩形,可以重叠,求面积并. n<=100: 暴力模拟扫描线.模拟赛大水题.(n^2) 甚至网上一种“分块”:分成n^2块,每一块看是否属于一个矩形. 甚至这个题就可以这么做. n<=1 ...
随机推荐
- C#-Windows服务创建和运行
Windows服务创建和运行 适用场景: ASP.Net通常是一个无状态的提供程序,不支持持续运行代码或者定时执行某段代码,所以我们需要构建自己的Windows服务来运行那些定时任务. 项目中需 ...
- Linux生产环境上,最常用的一套“Sed“技巧
sed命令应用广泛,使用简单,是快速文本处理的利器.它其实没多少技巧,背诵.使用是最合适的学习渠道,属于硬技能.但它又很复杂,因为高级功能太多.本篇不去关注sed的高级功能,仅对常用的一些操作,进行说 ...
- 1 matplotlib绘制折线图
from matplotlib import pyplot as plt #设置图形大小 plt.figure(figsize=(20,8),dpi=80) plt.plot(x,y,color=&q ...
- mybatis中参数为list集合时使用 mybatis in查询
mybatis中参数为list集合时使用 mybatis in查询 一.问题描述mybatis sql查询时,若遇到多个条件匹配一个字段,sql 如: select * from user where ...
- springboot笔记10——整合Redis
依赖 <dependencies> <!--web依赖--> <dependency> <groupId>org.springframework.boo ...
- VS调试 DataTable (转载)
调试的时候遇到一个问题:不知道怎么在自动窗口或者添加监视那里查看DataSet或者DataTable的具体的值.度娘了一下很多都是添加DataTable.Rows[][]监视,但是一行一列地看还是有点 ...
- maven学习笔记三(依赖特性,作用域)
上一章中 我们看到了添加了个junit的依赖包.那么maven中想添加依赖的jar包我们只需要配置相应的dependency就行.例如: <dependency> <groupId ...
- HTML&CSS基础-外部样式表
HTML&CSS基础-外部样式表 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.如下图所示,有2个文件 p { color:pink; font-size:40px; ...
- php将原数组倒序array_reverse()
1.数组倒序排列 $arr = array(1,2,3); $arr = array_reverse($arr); print_r($arr);
- HTML常用全部代码--第一部分--HTML/CSS( 小伙伴要牢记😁😁😁😁 )
<一>html代码大全:结构性定义 (1) 文件类型<HTML></HTML> (放在档案的开头与结尾) (2) 文件主题<TITLE></TIT ...