hdu 1255 覆盖的面积 (线段树处理面积覆盖问题(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1255
覆盖的面积
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2933 Accepted Submission(s): 1447

注意:本题的输入数据较多,推荐使用scanf读入数据.

#include<iostream>
#include<stdio.h>
#include<algorithm> using namespace std;
#define N 1005 // 定义线段,每个矩形看成两条竖线
struct Line
{
double x,y1,y2;
int flag; // 1表示入边,-1表示出边 ,算覆盖的时候要用
}line[N<<]; // 定义线段树的节点,其中x,y1<y2 分别对应线段的坐标
struct Nod
{
int l,r; // 离散化,Y[l]和Y[r]表示节点所覆盖的Y轴上的范围
double x,y1,y2;
int cover; // 记录线段覆盖的次数
}node[N<<]; double yy[N<<]; // 保存纵坐标,用于排序 bool cmp(Line a,Line b) // 比较函数,用于对线段进行排序
{
return a.x<b.x;
} void building(int l,int r,int p) // 构建线段树
{
node[p].l = l;
node[p].r = r;
node[p].cover = ;
node[p].y1 = yy[l];
node[p].y2 = yy[r];
if(l+==r) return; //到达叶子
int mid = (l+r)>>;
building(l,mid,p<<);
building(mid,r,p<<|); //注意不是mid+1,因为叶子节点要计算长度
} // 更新线段树,插入新的线段,每次插入如果完全覆盖则要对cover进行更新
double update(Line le,int p)
{
// 如果当前线段完全没有被覆盖
if(node[p].y2<=le.y1||node[p].y1>=le.y2) return ;
if(node[p].l+==node[p].r) //叶子
{
if(node[p].cover<) // 覆盖次数小于2的时候,更新cover值,以及记录当前x坐标
{
node[p].cover+=le.flag;
node[p].x = le.x;
return ;
}
else // 覆盖次数大于等于2的叶子节点则直接计算覆盖区间
{
double res = (le.x-node[p].x)*(node[p].y2-node[p].y1);
node[p].cover+=le.flag;
node[p].x = le.x;
return res;
}
}
return update(le,p<<)+update(le,p<<|); //面积为叶子节点面积之和
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int i,cnt=; // 记录竖线的数量(注意最后多1)
double x1,y1,y2,x2;
// 输入并保存y坐标和竖线
for(i=;i<=n;i++)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
yy[cnt] = y1;
line[cnt].x = x1;
line[cnt].y1 = y1;
line[cnt].y2 = y2;
line[cnt++].flag = ; yy[cnt] = y2;
line[cnt].x = x2;
line[cnt].y1 = y1;
line[cnt].y2 = y2;
line[cnt++].flag = -;
}
// 对纵坐标和线段进行排序
sort(yy+,yy+cnt);
sort(line+,line+cnt,cmp);
building(,cnt-,);
double ans = ;
// 扫描线从左到右进行
for(i=;i<cnt;i++)
{
ans+=update(line[i],);
}
printf("%.2lf\n",ans);
}
return ;
}
hdu 1255 覆盖的面积 (线段树处理面积覆盖问题(模板))的更多相关文章
- HDU 1264 Counting Squares(线段树求面积的并)
Counting Squares Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu 1542 线段树扫描(面积)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- HDU.1689 Just a Hook (线段树 区间替换 区间总和)
HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...
- hdu 1754 I Hate It 线段树 点改动
// hdu 1754 I Hate It 线段树 点改动 // // 不多说,裸的点改动 // // 继续练 #include <algorithm> #include <bits ...
随机推荐
- 不使用Math.random实现随机数。
var rand = (function(){ var today = new Date(); var seed = today.getTime(); function rnd(){ seed = ( ...
- 类结构体 与 byte[] 转换类
public static class StructConvert { public static object BytesToStruct(byte[] bytes, Type strcutType ...
- 如何使用jQuery设置背景的透明度
如何使用jQuery设置背景的透明度:使用CSS可以设置背景的透明度,具体方法可以参阅CSS如何设置div背景透明度且兼容性良好,不过使用CSS设置透明度没有动态效果,如果实现也比较困难,下面就介绍一 ...
- Cordova+angularjs+ionic+vs2015开发(一)
欢迎加群学习:457351423 这里有4000多部学习视频,涵盖各种技术,有需要的欢迎进群学习! 一.Windows环境配置 1.如果已经安装VS2015,打开[工具]-[选项]找到Cordova选 ...
- 对象创建型模式------Builder(生成器或建造者模式)(2)
链接转自:http://blog.csdn.net/wuzhekai1985/article/details/6667467 主要思想是:首先有个指挥家思想者将大体的设计思路设计出来,然后寻找一部分工 ...
- SpringInAction读书笔记--第4章面向切面
1.什么是面向切面编程 在软件开发中,散布于应用中多处的功能被称为横切关注点,这些横切关注点从概念上是与应用的业务逻辑相分离的,但往往分直接嵌入到应用的业务逻辑之中,把这些横切关注点与业务逻辑相分离正 ...
- bzoj1016:[JSOI2008]最小生成树计数
思路:模拟kruskal的过程,可以发现对于所有权值相同的边,有很多种选择的方案,而且权值不同的边并不会相互影响,因为先考虑权值较小的边,权值比当前权值大的边显然不在考虑范围之内,而权值比当前权值小的 ...
- C++ DLL 获取 MSI Property
VS2010 创建 C++, Win32 DLL工程C-TEST. Stdafx.h中,在<windows.h>之后 添加引用. #include <msi.h> #incl ...
- HDOJ 1176 免费馅饼 -- 动态规划
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1176 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小 ...
- OpenJudge/Poj 1321 棋盘问题
1.链接地址: http://bailian.openjudge.cn/practice/1321 http://poj.org/problem?id=1321 2.题目: 棋盘问题 Time Lim ...