覆盖的面积 HDU - 1255 线段树+扫描线+离散化 求特定交叉面积
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
const int N=;
struct Node
{
double x,yl,yh;
int w;
bool operator<(Node t)const
{
return x<t.x;
} }edge[N];
struct
{
int l,r,cover;
}tr[N];
double ys[N];
void build(int u,int l,int r)
{
int mid=l+r>>;
tr[u].l=l,tr[u].r=r;
tr[u].cover=;
if (r-l>)
{
build(u<<,l,mid);
build(u<<|,mid,r);
}
}
void modify(int u,int l,int r,int val)
{
int mid=tr[u].l+tr[u].r>>;
if(tr[u].l==l&&tr[u].r==r)
{
tr[u].cover+=val;
}
else if(tr[u].r-tr[u].l>)
{
if (l>=mid)
modify(u<<|,l,r,val);
else if(r<=mid)
modify(u<<,l,r,val);
else
{
modify(u<<,l,mid,val);
modify(u<<|,mid,r,val);
}
}
}
void query(int root,double &ans)
{
//如果被覆盖次数大于1
if (tr[root].cover>)
ans+=ys[tr[root].r]-ys[tr[root].l];
//上式不满足时,可能往下的子区间满足,就往下递归
//如果不是叶节点
else if(tr[root].r-tr[root].l>)
{
tr[root<<].cover+=tr[root].cover;
tr[root<<|].cover+=tr[root].cover;
tr[root].cover=;
query(root<<,ans);
query(root<<|,ans);
}
}
int main()
{
int T,N;
double x1,x2,y1,y2,ans,res;
scanf("%d",&T);
while(T--)
{
res=;
map<double,int>mp;
scanf("%d",&N);
for (int i=,j=;i<=N;++i,j+=)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
//入边
edge[j].x=x1,edge[j].yl=y1,edge[j].yh=y2;
edge[j].w=;
//出边
edge[j+].x=x2,edge[j+].yl=y1,edge[j+].yh=y2;
edge[j+].w=-;
//扫描线
ys[j]=y1,ys[j+]=y2; }
//按x排序
sort(edge+,edge++*N);
//y离散化
sort(ys+,ys++*N);
int cnt=unique(ys+,ys++*N)-(ys+);
build(,,cnt);
//离散化
//映射之后的编号 ,查询的实话再映射到ys中去
for (int i=;i<=cnt;++i)
mp[ys[i]]=i;
for (int i=;i<*N;++i)
{
ans=;
//插进去
modify(,mp[edge[i].yl],mp[edge[i].yh],edge[i].w);
query(,ans);
res+=ans*(edge[i+].x-edge[i].x);
}
printf("%.2lf\n",res);
}
return ;
}
覆盖的面积 HDU - 1255 线段树+扫描线+离散化 求特定交叉面积的更多相关文章
- POJ 1177 Picture(线段树 扫描线 离散化 求矩形并面积)
题目原网址:http://poj.org/problem?id=1177 题目中文翻译: 解题思路: 总体思路: 1.沿X轴离散化建树 2.按Y值从小到大排序平行与X轴的边,然后顺序处理 如果遇到矩形 ...
- hdu 1255(线段树 扫描线) 覆盖的面积
http://acm.hdu.edu.cn/showproblem.php?pid=1255 典型线段树辅助扫描线,顾名思义扫描线就是相当于yy出一条直线从左到右(也可以从上到下)扫描过去,此时先将所 ...
- 覆盖的面积(HDU 1255 线段树)
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem D ...
- hdu 4419 线段树 扫描线 离散化 矩形面积
//离散化 + 扫描线 + 线段树 //这个线段树跟平常不太一样的地方在于记录了区间两个信息,len[i]表示颜色为i的被覆盖的长度为len[i], num[i]表示颜色i 『完全』覆盖了该区间几层. ...
- HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1542 线段树+扫描线+离散化
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- hdu 1828 线段树扫描线(周长)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu1542 Atlantis (线段树+扫描线+离散化)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
随机推荐
- ubuntu系统下安装pip3及第三方库的安装
ubuntu系统下会自带python2.x和python3.x坏境,不需要我们去安装.并且ubuntu系统下还会自动帮助我们安装python2.x坏境下的pip安装工具, 但是没有python3.x坏 ...
- HDU_1222_GCD
http://acm.hdu.edu.cn/showproblem.php?pid=1222 直接用GCD就可以了,gcd大于1表明每次一周后偏移量为0. #include<iostream&g ...
- 二、Mongodb常用命令
#进入admin数据库 use admin #进行权限认证 db.auth('userAdmin', '123456') #查询所有用户 db.system.users.find() #更新用户 db ...
- mongo 集群(副本)搭建过程记录
最近搭建mongo集群,回忆总结,作以记录.整个过程主要参考以下两篇文章,但是过程并不顺利,有些问题需要记录.https://www.cnblogs.com/dba-devops/p/7130710. ...
- 你知道EasyX吗
关于C++控制台上的图形界面,你知道一个东西叫做EasyX吗? 作为一个退役的OI选手(WTF?\(3^2-3^1\)年级退役?),在退役之后总想找点事情做. 开发个游戏?(我只会控制台) 学下人工智 ...
- Visual Studio 2015 配置 Python 环境
Visual Studio 2015可以在安装时选择安装Python环境,首次使用VS2015执行python时需要配置环境变量: 配置VS2015的环境前需要先下载Python并安装: https: ...
- python学习(5)写一个二分算法的程序
把之前学习的做一个小结.之前看二分查找法,只能是似而非地看懂大概.现在用这么多天的知识积累已经可以自己写了. 而且在算法书的基础上,把需要找的数字做一个人机互动操作. 另外,初步接触到了 __name ...
- 小cookie,大智慧
Cookie是什么?cookies是你访问网站时创建的数据片段文件,通过保存浏览信息,它们使你的在线体验更加轻松. 使用cookies,可以使你保持在线登录状态,记录你的站点偏好,并为你提供本地化支持 ...
- Java:枚举类也就这么回事
目录 一.前言 二.源自一道面试题 三.枚举的由来 四.枚举的定义形式 五.Enum类里有啥? 1.唯一的构造器 2.重要的方法们 3.凭空出现的values()方法 六.反编译枚举类 七.枚举类实现 ...
- 大延时情况tcp和udp测试
环境搭建 使能Ubuntu的IPv6转发功能 root@yanhc-Aspire-4738G:/home/yanhc# cat /proc/sys/net/ipv4/ip_forward root@y ...