HDU 5091 线段树扫描线
给出N个点。和一个w*h的矩形
给出N个点的坐标,求该矩形最多能够覆盖多少个点
对每一个点point(x。y)右边生成相应的点(x+w,y)值为-1;
纵向建立线段树,从左到右扫描线扫一遍。遇到点则用该点的权值更新区间(y,y+h)
#include "stdio.h"
#include "string.h"
#include "algorithm"
using namespace std; struct Mark
{
int x,y,s;
}mark[30010]; struct node
{
int l,r,x,lazy;
}data[200010]; bool cmp(Mark a, Mark b)
{
if (a.x!=b.x)
return a.x<b.x;
else
return a.s>b.s;
} int Max(int a,int b)
{
if (a<b) return b;
else return a;
} void build(int l,int r,int k)
{
int mid; data[k].l=l;
data[k].r=r;
data[k].x=0;
data[k].lazy=0; if (l==r) return ;
mid=(l+r)/2; build(l,mid,k*2);
build(mid+1,r,k*2+1);
} void updata(int l,int r,int k,int op)
{
int mid;
if (data[k].l==l && data[k].r==r)
{
data[k].x+=op;
data[k].lazy+=op;
return ;
} if (data[k].lazy!=0)
{
data[k*2].x+=data[k].lazy;
data[k*2].lazy+=data[k].lazy;
data[k*2+1].x+=data[k].lazy;
data[k*2+1].lazy+=data[k].lazy;
data[k].lazy=0;
} mid=(data[k].l+data[k].r)/2; if (r<=mid) updata(l,r,k*2,op);
else
if (l>mid) updata(l,r,k*2+1,op);
else
{
updata(l,mid,k*2,op);
updata(mid+1,r,k*2+1,op);
} data[k].x=Max(data[k*2].x,data[k*2+1].x);
}
int main()
{
int n,w,h,i,x,y,ans;
while (scanf("%d",&n)!=EOF)
{
if (n<0) break;
scanf("%d%d",&w,&h);
for (i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
x+=20000;
y+=20000;
mark[i*2].x=x;
mark[i*2].y=y;
mark[i*2].s=1;
mark[i*2+1].x=x+w;
mark[i*2+1].y=y;
mark[i*2+1].s=-1;
}
sort(mark,mark+n*2,cmp);
build(0,40000,1); ans=0;
for (i=0;i<n*2;i++)
{
y=mark[i].y+h;
if (y>40000) y=40000;
updata(mark[i].y,y,1,mark[i].s);
ans=Max(ans,data[1].x);
}
printf("%d\n",ans); }
return 0;
}
HDU 5091 线段树扫描线的更多相关文章
- hdu 5091(线段树+扫描线)
上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 1828 线段树扫描线(周长)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 5107 线段树扫描线
给出N个点(x,y).每一个点有一个高度h 给出M次询问.问在(x,y)范围内第k小的高度是多少,没有输出-1 (k<=10) 线段树扫描线 首先离散化Y坐标,以Y坐标建立线段树 对全部的点和询 ...
- hdu 1255(线段树 扫描线) 覆盖的面积
http://acm.hdu.edu.cn/showproblem.php?pid=1255 典型线段树辅助扫描线,顾名思义扫描线就是相当于yy出一条直线从左到右(也可以从上到下)扫描过去,此时先将所 ...
- hdu 1542 线段树+扫描线 学习
学习扫描线ing... 玄学的东西... 扫描线其实就是用一条假想的线去扫描一堆矩形,借以求出他们的面积或周长(这一篇是面积,下一篇是周长) 扫描线求面积的主要思想就是对一个二维的矩形的某一维上建立一 ...
- hdu 4419 线段树 扫描线 离散化 矩形面积
//离散化 + 扫描线 + 线段树 //这个线段树跟平常不太一样的地方在于记录了区间两个信息,len[i]表示颜色为i的被覆盖的长度为len[i], num[i]表示颜色i 『完全』覆盖了该区间几层. ...
- hdu 3265 线段树扫描线(拆分矩形)
题意: 给你n个矩形,每个矩形上都有一个矩形的空洞,所有的矩形都是平行于x,y轴的,最后问所有矩形的覆盖面积是多少. 思路: 是典型的矩形覆盖问题,只不过每个矩形上多了一个矩 ...
- HDU 1828 线段树+扫描线(计算矩形周长并)
题意:给你n个矩形,然后矩形有可能重叠,要你求周长 思路:首先碰到这种矩形在数轴上那么第一反应应该想到的是扫描线, 做周长我们有两种方法 第一种,我们可以分开两部分求,第一遍求x轴上的贡献,第二遍求y ...
随机推荐
- Matlab常用小技巧及部分快捷键
Matlab常用小技巧一: 1. m文件如果是函数,保存的文件名最好与函数名一致,这点都很清楚.不过容易疏忽的是,m文件名的命名尽量不要是简单的英文单词,最好是由大小写英文/数字/下划线等组成.原因是 ...
- 在C语言中基本数据类型所占的字节数
基本数据类型所占的字节数其实跟C语言本身没有太大的关系,它取决于编译器的位数,下面这张表说明了不同编译器下基本数据类型的长度: 32位编译器中各基本类型所占字节数: 注:对于32位的编译器,指针变量的 ...
- Lucence.Net+添加关键词+分页+排序
1.使用queryparser完成解析搜索请求 2.基本格式如: QueryParser parser=new QueryParser("字段名称","分析器实例&quo ...
- Structs
1.服务端的运行程序 2.Servlet的三个方法 init service:抽象方法 destroy 3.步骤 (1).在web.xml中 <servlet> <servlet-n ...
- poj 2773 Happy 2006 容斥原理+二分
题目链接 容斥原理求第k个与n互质的数. #include <iostream> #include <vector> #include <cstdio> #incl ...
- IntelliJ IDEA中创建并运行scala应用程序
1.安装scala插件 2.创建scala项目 下载scala SDK,如果你已经下载了,选择你所下载的版本,点击OK
- 【转】AC算法详解
原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...
- C# 读书笔记之访问虚方法、重写方法和隐藏方法
C#允许派生类中的方法与基类中方法具有相同的签名:基类中使用关键字virtual定义虚方法:然后派生类中使用关键字override来重写方法,或使用关键字new来覆盖方法(隐藏方法). 重写方法用相同 ...
- HDU 3231 Box Relations
题目大意: 给定一些正方体的关系,要求一组符合这些关系的正方体坐标,如果不存在符合条件的正方体坐标,IMPOSSIBLE.(Special Judge) 实力还是太弱了,完全不会…… #include ...
- Happy Matt Friends(dp)
Happy Matt Friends Time Limit: 6000/6000 MS (Java/Others) Memory Limit: 510000/510000 K (Java/Oth ...