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 ...
随机推荐
- zcmu 1540第k大数
1540: 第k大数Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Web Board]Description有两个序列a,b,它们的 ...
- sso cas 坑
一个中文文档地址: http://www.cassso-china.cn/apereo_github_cas_5.2/apereo.github.io/cas/5.2.x/ ============= ...
- Java 随机数生成工具RandomUtils
RandomUtils /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p> ...
- SnowflakeIdWorker
/** * Twitter_Snowflake<br> * SnowFlake的结构如下(每部分用-分开):<br> * 0 - 0000000000 0000000000 0 ...
- 在Java中如何设置一个定时任务,在每天的一个时间点自动执行一个特定的程序
Quartz定时机制 首先导入jar包到程序内 quartz-all-1.6.0.jar 然后创建一个XML TimeConfig.xml 名字可以自己定义 <?xml version=&quo ...
- 2019年Amazon AWS-Solutions-Architect-Professional考试最新题库(AWS SAP题库)带考试模拟器
大家好,由于最近自己备考Amazon AWS-Solutions-Architect-Professional考试,购买了以下链接的题库,并通过了考试 https://www.kaoguti.gq/A ...
- python爬虫-房天下-登录
房天下-登录 本次爬取的网址为:https://passport.fang.com 一.分析请求 输入用户名和密码,点击登录按钮 请求的参数为: uid: 123456789 pwd: 64ccd42 ...
- 【面试突击】- Java面试总则
Java基础 1.Map.Set.List集合差别及联系详解 2.HashSet类是如何实现添加元素保证不重复的 3.HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安 ...
- 如何将一个react组件进行静态化调用
ant-design的message组件可以使用message.xxx的方法调用,调用代码如下: import { message, Button } from 'antd'; const info ...
- DB2数据库中DB2字符串类型
DB2字符串是DB2数据库中的基础知识,下面就为您分类介绍DB2字符串,供您参考,如果您对DB2字符串方面刚兴趣的话,不妨一看. DB2字符串是字节序列.DB2字符串包括 CHAR(n) 类型的定长字 ...