覆盖的面积 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 ...
随机推荐
- SpringBoot学习(3) - jdbc
数据库使用MySQL 5.7.18版本. 装配DataSource的步骤:1.加入数据库驱动 pom.xml: <project xmlns="http://maven.apache. ...
- webpack入门系列1
一.什么是webpack?为什么要使用它? Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 为什么我们要使用它呢?因 ...
- 关于java String类的getBytes(String charsetName)和String(byte[] bytes, String charsetName)
public byte[] getBytes(Charset charset) Encodes this String into a sequence of bytes using the given ...
- CInternetSession的简单使用
1. CInternetSession的简单使用 CInternetSession session; CHttpFile *file = NULL; CString strURL = " h ...
- 视觉slam十四讲第七章课后习题6
版权声明:本文为博主原创文章,转载请注明出处: http://www.cnblogs.com/newneul/p/8545450.html 6.在PnP优化中,将第一个相机的观测也考虑进来,程序应如何 ...
- Codeforces 1017D The Wu(状态压缩+预处理)
题意: 给你n m q,表示在这一组数据中所有的01串长度均为n,然后给你一个含有m个元素的multiset,之后有q次询问.每次询问会给你一个01串t和一个给定常数k,让你输出串t和multiset ...
- SpringCloud五大神兽之Eureka
注册中心概述 什么是注册中心? 相当于服务之间的'通讯录',记录了服务和服务地址之间的映射关系.在分布式架构中服务会注册到这里.当服务需要调用其他服务时,就在注册中心找到其他服务的地址,进行调用 注册 ...
- Golang的sync.WaitGroup 实现逻辑和源码解析
在Golang中,WaitGroup主要用来做go Routine的等待,当启动多个go程序,通过waitgroup可以等待所有go程序结束后再执行后面的代码逻辑,比如: func Main() { ...
- C#在窗体中按下鼠标键拖动窗体
[DllImport("user32.dll")]//拖动无窗体的控件 public static extern bool ReleaseCapture(); [DllImport ...
- spark sql 查询hive表并写入到PG中
import java.sql.DriverManager import java.util.Properties import com.zhaopin.tools.{DateUtils, TextU ...