覆盖的面积 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 ...
随机推荐
- idea个人配置记录
idea.properties # Use ${idea.home.path} macro to specify location relative to IDE installation home. ...
- java核心技术----访问权限
Java支持四种不同的访问权限: 修饰符 说明 public 共有的,对所有类可见 protected 受保护的,对同一包内的类和所有子类可见 private 私有的,在同一类内可见 默认的 在同一包 ...
- 简单处理IP XML数据
///* 编译环境: visual c++ */ //#include <stdio.h> //#include <winsock2.h> //#pragma comment( ...
- HDU_4456_二维树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=4456 第一道二维树状数组就这么麻烦,题目要计算的是一个菱形范围内的和,于是可以把原来的坐标系旋转45度,就是求一 ...
- Codeforces 977D Divide by three, multiply by two(拓扑排序)
Polycarp likes to play with numbers. He takes some integer number xx, writes it down on the board, ...
- 关于django.conf.urls的路由匹配问题
1. 问题 目前自己在写一个网站,但是在后端写好api前端请求的时候,无论如何都请求不到对应的python函数上去,于是自己就把对应的url名修改之后就可以了,具体如下: ## 出现问题的代码 fro ...
- js 浏览器兼容问题及解决办法
JS中出现的兼容性问题的总结 1.关于获取行外样式 currentStyle 和 getComputedStyle 出现的兼容性问题 我们都知道js通过style不可以获取行外样式,当我们需要获取行 ...
- 11g与12c启动,关闭RAC
oracle11g 关闭,启动顺序 1.关闭数据库(oracle)srvctl stop database -d rac 2.关闭集群(root)crsctl stop cluster -all 3. ...
- 一个基于图的数据管理系统-gStore
gStore是遵循 BSD协议的一个开源项目.一个基于图的 RDF 三元组存储的数据管理系统.该项目是北京大学.滑铁卢大学.香港科技大学的联合研究项目.中国北京大学计算机科学与技术研究所的数据库组对该 ...
- [Redis-CentOS7]Redis设置连接密码(九)
设置Redis密码 修改/etc/redis.conf 一定要强密码redis为内存存储 抗暴力破解强 requirepass password 重启服务 systemctl restart redi ...