hdu 1255 覆盖的面积 (扫描线求矩形交)
覆盖的面积
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7985 Accepted Submission(s): 4038

注意:本题的输入数据较多,推荐使用scanf读入数据.
5
1 1 4 2
1 3 3 7
2 1.5 5 4.5
3.5 1.25 7.5 4
6 3 10 7
3
0 0 1 1
1 0 2 1
2 0 3 1
题目大意:
求n个矩形重复覆盖的面积。
线段树求矩形交的经典题。
首先离散化还是要去重,即使是浮点数,我的去重离散化模板还是稳得住的。
其次线段树节点中的cov要理解好。
最后跟标准线段树可以有些不同的,毕竟query永远是全部询问。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#define ll long long
#define maxn 1000 using namespace std; double t[maxn*+];//排序数组
double a[maxn*+];//原始数据
int b[maxn*+];//离散后的数据
double to[maxn*+];//离散后的数据到原数据的映射 struct tseg
{
int x1,x2,y;
int flag;//+1表示下边,-1表示上边
bool operator<(const tseg& b) const
{
return y<b.y;
}
};
tseg seg[maxn*+]; struct ttree
{
int l,r;
int cov;//cov是扫描线的重点 -1不确定 >=0完全覆盖次数
inline double len()
{
return to[r]-to[l];
}
};
ttree tree[maxn**+]; void pushup(int x)
{
if(tree[x].l+==tree[x].r)
return;
if(tree[x*].cov==tree[x*+].cov)
tree[x].cov=tree[x*].cov;
else
tree[x].cov=-;
} void pushdown(int x)
{
if(tree[x].l+==tree[x].r)
return;
if(tree[x].cov>=)
tree[x*].cov=tree[x*+].cov=tree[x].cov;
} void build(int x,int l,int r)
{
tree[x].l=l;
tree[x].r=r;
tree[x].cov=;
if(l+<r)
{
int mid=(l+r+)/;
build(x*,l,mid);
build(x*+,mid,r);
}
} void modify(int x,int l,int r,int op)
{
if(l<=tree[x].l&&r>=tree[x].r&&tree[x].cov>=)
{
tree[x].cov+=op;
}
else
{
pushdown(x);
int mid=(tree[x].l+tree[x].r+)/;
if(l<mid)
modify(x*,l,r,op);
if(r>mid)
modify(x*+,l,r,op);
pushup(x);
}
} //扫描线的query可以简略着写,因为一定是全部查询
double query(int x)
{
if(tree[x].cov>=)
return tree[x].len();
else if(tree[x].cov==||tree[x].cov==)
return ;
else
{
pushdown(x);
double ret=;
ret+=query(x*);
ret+=query(x*+);
return ret;
}
} int main()
{
int tt;
scanf("%d",&tt);
while(tt--)
{
int n;
scanf("%d",&n);
for(int i=;i<n*;i++)
{
scanf("%lf",a+i);
t[i]=a[i];
}
sort(t,t+n*);
int m=unique(t,t+n*)-t;//编号1..m
for(int i=;i<n*;i++)
{
b[i+]=lower_bound(t,t+m,a[i])-t+;
to[b[i+]]=a[i];
} for(int i=,j=;i<=n*;i+=,j+=)
{
seg[j]=(tseg){b[i],b[i+],b[i+],};
seg[j+]=(tseg){b[i],b[i+],b[i+],-};
}
sort(seg+,seg++n*); build(,,m);
double ans=;
for(int i=;i<=n*;i++)
{
if(i>=)
{
double len=query();
ans+=len*(to[seg[i].y]-to[seg[i-].y]);
}
modify(,seg[i].x1,seg[i].x2,seg[i].flag);
} printf("%.2f\n",ans);
}
return ;
}
hdu 1255 覆盖的面积 (扫描线求矩形交)的更多相关文章
- HDU 1255 覆盖的面积 ( 扫描线 + 离散 求矩阵大于k次面积并 )
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)
链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...
- hdu 1255 覆盖的面积(求覆盖至少两次以上的面积)
了校赛,还有什么途径可以申请加入ACM校队? 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- hdu 1255 覆盖的面积(线段树 面积 交) (待整理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. In ...
- hdu 1255 覆盖的面积 (线段树处理面积覆盖问题(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1255 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memo ...
- HDU 1255 覆盖的面积(线段树:扫描线求面积并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题目大意:给你若干个矩形,让你求这些矩形重叠两次及以上的部分的面积. 解题思路:模板题,跟HDU ...
- HDU - 1255 覆盖的面积 (线段树求面积交)
https://cn.vjudge.net/problem/HDU-1255 题意 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 分析 求面积并的题:https://www.cnbl ...
- HDU 1255 覆盖的面积(线段树+扫描线)
题目地址:HDU 1255 这题跟面积并的方法非常像,仅仅只是须要再加一个变量. 刚開始我以为直接用那个变量即可,仅仅只是推断是否大于0改成推断是否大于1.可是后来发现了个问题,由于这个没有下放,没延 ...
- HDU 1255 覆盖的面积 (扫描线 线段树 离散化 矩形面积并)
题目链接 题意:中文题意. 分析:纯手敲,与上一道题目很相似,但是刚开始我以为只是把cnt>=0改成cnt>=2就行了,. 但是后来发现当当前加入的线段的范围之前 还有线段的时候就不行了, ...
随机推荐
- usaco training <1.2 Greedy Gift Givers>
题面 Task 'gift1': Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided t ...
- 前端的构建化工具Webpack
经常看到如jquery-3.0.0.js和jquery-3.0.0-min.js等两相似的文件名. 其实以上两个文件名的内容是一样的,不过带min代表的是占用最小的空间,为项目提高性能.压缩的部分如换 ...
- goland_beego框架学习--api实现
goland_beego框架学习--api实现 完成一项api实现的流程 (1)beego框架的router层里面注册路由 正则路由 为了用户更加方便的路由设置,beego 参考了 sinatra 的 ...
- MyBatis 数值类型 where 条件配置的坑
复现异常 我们先通过案例复现该类异常,测试项目地址:https://gitee.com/yin_jw/demo/tree/master/mybatis-demo/springboot-mybatis- ...
- python爬虫项目-一见倾心壁纸
方法1 import re import urllib import urllib.request def getHtml(url): page = urllib.request.urlopen(ur ...
- day 37 CSS
参考博客:https://www.cnblogs.com/majj/p/9021419.html 1.CSS的三种链接样式: 行内链接(优先级最高) 内接样式 外接样式 <html lang=& ...
- C# VS2019 WebService创建与发布,并部署到Windows Server 2012R
前言 上一次数据库灾备和性能优化后,数据库专家建议,在不扩容的情况下,客户端不能再频繁的扫描数据库了!一句惊醒梦中人,因为我也发现数据库越来越卡了,自从上个项目上线后,就出现了这个情况.后来分析其原因 ...
- day20191010ClassNotes
笔记: 1.DAO模式组成部分: 程序 ----> 数据库 实体类 数据库中的表 工具类:公共的数据库连接.关闭.公共的增删改.查询 接口 : 程序提倡的是面向接口编程,从而降低程序的耦合性 实 ...
- MySQL分层和查询数据的流程
MySQL分层 MySQL分层 主要分为:连接层,服务层,引擎层,存储层 客户端执行一条select命令的流程如下 连接器 功能: 负责跟客户端建立连接.获取权限.维持和管理连接 细节: 1.当用户登 ...
- redis与memcached区别
不同点: (1) redis中并不是所有数据在有效期内只能常驻内存的(如果需要,可定期同步持久化到磁盘),这是和memcached相比一个最大的区别(memcached中的数据在有效期内是以键值对的形 ...