hdu-1255(线段树求面积并)模板
题目链接:传送门
思路:
(1)建立线段的信息,每个线段存储l到r的线段的x位置和y的起始点与终点。
建立线段树的节点信息,每个节点代表一个区间的信息,x表示区间的横坐标的位置,l,r表示纵坐标的范围,flag表示是否标记过,cover表示线段的覆盖次数。
(2)先将y的位置按照从小到大排序,再将边按照x的先后位置排序,然后建树,这样可以依次求出那部分被覆盖了。
(3)建树:如果不是叶子节点就标记为false,否则是true
(4)插入新区域:如果先不断递归找到合适区域,再求出这个区域的面积,和一般的线段树操作基本相同。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = ;
struct Node{
double x,l,r;
int flag,cover;
}node[maxn<<];
struct LINE{
double x,y_up,y_down;
int flag;
}line[maxn];
double y[maxn];
bool cmp(LINE a,LINE b)
{
return a.x<b.x;
}
void build(int rt,int l,int r)
{
node[rt].l=y[l];
node[rt].r=y[r];
node[rt].flag=false;
node[rt].cover=;
node[rt].x=-;
if(l+==r) //表示一个叶子节点
{
node[rt].flag=true;
return ;
}
int mid=(l+r)>>;
build(rt<<,l,mid); //区间是连续的。
build(rt<<|,mid,r);
}
double Insert(int rt,double x,double l,double r,int flag)
{
if(l>=node[rt].r||r<=node[rt].l) return ;
if(node[rt].flag) //找到一个叶节点
{
if(node[rt].cover>) //覆盖次数大于1
{
double pre=node[rt].x;
double ans=(x-pre)*(node[rt].r-node[rt].l);
node[rt].x=x;
node[rt].cover+=flag;
return ans;
}
else
{
node[rt].x=x;
node[rt].cover+=flag;
return ;
}
}
double ans=;
ans+=Insert(rt<<,x,l,r,flag);
ans+=Insert(rt<<|,x,l,r,flag);
return ans;
}
int main(void)
{
int T,i,cnt,j,n;
double x1,y1,x2,y2;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(cnt=-,i=;i<n;i++)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
y[++cnt]=y1;
line[cnt].x=x1;
line[cnt].y_down=y1;
line[cnt].y_up=y2;
line[cnt].flag=;
y[++cnt]=y2;
line[cnt].x=x2;
line[cnt].y_down=y1;
line[cnt].y_up=y2;
line[cnt].flag=-;
}
sort(y,y+cnt+);
sort(line,line+cnt+,cmp);
build(,,cnt);
double ans=;
for(i=;i<=cnt;i++)
{
ans+=Insert(,line[i].x,line[i].y_down,line[i].y_up,line[i].flag);
}
printf("%.2lf\n",ans);
}
return ;
}
hdu-1255(线段树求面积并)模板的更多相关文章
- hdu 1542 线段树扫描(面积)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- hdu 1394 (线段树求逆序数)
<题目链接> 题意描述: 给你一个有0--n-1数字组成的序列,然后进行这样的操作,每次将最前面一个元素放到最后面去会得到一个序列,那么这样就形成了n个序列,那么每个序列都有一个逆序数,找 ...
- HDU - 1255 覆盖的面积 (线段树求面积交)
https://cn.vjudge.net/problem/HDU-1255 题意 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 分析 求面积并的题:https://www.cnbl ...
- 覆盖的面积(HDU 1255 线段树)
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem D ...
- hdu 1255(线段树 扫描线) 覆盖的面积
http://acm.hdu.edu.cn/showproblem.php?pid=1255 典型线段树辅助扫描线,顾名思义扫描线就是相当于yy出一条直线从左到右(也可以从上到下)扫描过去,此时先将所 ...
- 覆盖的面积 HDU - 1255(扫描线求面积交)
题意: 就是扫描线求面积交 解析: 参考求面积并.... 就是把down的判断条件改了一下..由w > 0 改为 w > 1 同时要讨论一下 == 1 时 的情况, 所以就要用到一个临时 ...
- HDU 1394 线段树求逆序对
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 覆盖的面积 HDU - 1255 线段树+扫描线+离散化 求特定交叉面积
#include<cstdio> #include<map> #include<algorithm> using namespace std; ; struct N ...
- HDU - 1542 Atlantis(线段树求面积并)
https://cn.vjudge.net/problem/HDU-1542 题意 求矩形的面积并 分析 点为浮点数,需要离散化处理. 给定一个矩形的左下角坐标和右上角坐标分别为:(x1,y1).(x ...
随机推荐
- 项目总结02:百度地图js 基本用法介绍
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- JDBC、ODBC、OLE DB、ADO、ADOMD区别与联系
ODBC: (Open Database Connectivity,开放数据库互连),它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口).这些API利用SQL来完成其大部分任务 ...
- eclipse配置mybatis xml文件自动提示(转)
原文链接 原文如下: 如果使用eclipse中,再写mybatis的xml文件的时候,没有提示,用“Alt+/”,不能把代码用快捷键敲出来,可以试试下面要说的这种方法,反正我试了,我这个可以. 1.下 ...
- XML文件的小结
1.Layer-list <?xml version="1.0" encoding="utf-8"?><layer-list xmlns:an ...
- 搭建FTP服务器 window7
1.安装IIS组件,打开控制面板-->程序和功能,点击打开或关闭windows功能 找到Internet信息服务,勾选FTP服务器和Web管理工具下的IIS管理控制台进行安装ftp,如图所示 2 ...
- document.write : 什么是在html输出中使用,什么是文档加载后使用?
理解:您只能在 HTML 输出中使用 document.write.如果您在文档加载后使用该方法,会覆盖整个文档. Javascript中只能在 HTML 输出流中使用 document.write, ...
- 关于sublime Text 3安装sublimecodeIntel插件配置方法
打开preferences-package settings-sublimecodeIntel-settings users 添加 { "JavaScript": { " ...
- poj 2785 让和为0 暴力&二分
题目链接:http://poj.org/problem?id=2785 大意是输入一个n行四列的矩阵,每一列取一个数,就是四个数,求有多少种着四个数相加和为0的情况 首先脑海里想到的第一思维必然是一个 ...
- MySql5.5 SQL优化 慢查询日志存储
一.MySql的慢查询日志的开启和存储 1.查看是否把没有使用索引的SQL记录到慢查询日志中,查看 log_queries_not_using_indexes 变量; show VARIABLES L ...
- APNS推送服务证书制作 图文详解教程(新)
iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务 ...