题意:移动一个矩形,使矩形内包含的点尽量多。

思路:把一个点拆成两个事件,一个进(权值为1)一个出(权值为-1),将所有点按照x排序,然后扫描,对于每个x,用一个滑窗计算一下最大值,再移动扫描线。树状数组可以实现。

上面方法其实不是最优的,目前所知最优的办法是把一个矩形压缩成一个点,而一个点延伸为一条线,遇到点的时候更新y+h的一个区间。(线段树懒操作),然后询问线段树上点(矩形)的最值。必须用线段树,时间复杂度会低一些。

类似思路的题目Seoul2007 LA3905,Meteor流星

只写了树状数组版,鉴于扫描线需要进一步学习,待更。

当时做的时候就知道是线段树,可惜我并不会写扫描线,以前尝试写过,挂了,基础有待加强。

#include<cstdio>
#include<algorithm>
using namespace std; const int maxh = +;
const int maxn = +; int C[maxh];
#define lowbit(x) (x&(-x))
void add(int x,int v)
{
while(x <= ){
C[x] += v; x += lowbit(x);
}
} int sum(int x){
int res = ;
while(x>){
res += C[x]; x -= lowbit(x);
}
return res;
}
struct Point
{
int x,y;
bool operator < (const Point & rhs) const {
return x < rhs.x;
}
}poi[maxn]; int main()
{
//freopen("in.txt","r",stdin);
int N;
while(~scanf("%d",&N)&& N>){
int W,H;
scanf("%d%d",&W,&H);
for(int i = ; i < N; i++){
scanf("%d%d",&poi[i].x,&poi[i].y);
poi[i].y += ;
}
sort(poi,poi+N);
int L , R; L = R = ;
int ans = ;
while(R<N){
while(poi[R].x - poi[L].x <= W && R<N){
add(poi[R++].y,);
}
for(int i = ,sz = - H ; i <= sz ; i++){
ans = max(ans,sum(i+H)-sum(i-));
}
if(R<N)
while(poi[R].x - poi[L].x > W){
add(poi[L++].y,-);
}
}
printf("%d\n",ans);
while(L<N){
add(poi[L++].y,-);
}
}
return ;
}

HDU 5091 Beam Cannon (扫描线思想)的更多相关文章

  1. hdu 5091 Beam Cannon(扫描线段树)

    题目链接:hdu 5091 Beam Cannon 题目大意:给定N个点,如今要有一个W∗H的矩形,问说最多能圈住多少个点. 解题思路:线段的扫描线,如果有点(x,y),那么(x,y)~(x+W,y+ ...

  2. HDOJ 5091 Beam Cannon 扫描线

    线段树+扫描线: 我们用矩形的中心点来描写叙述这个矩形,然后对于每一个敌舰,我们建立一个矩形中心的活动范围,即矩形中心在该范围内活动就能够覆盖到该敌舰.那么我们要求的问题就变成了:随意一个区域(肯定也 ...

  3. hdu 5091 Beam Cannon

    题目大意: 有n个点(n<=10000),点的坐标绝对值不超过20000,然后问你用一个w*h(1<=w,h<=40000)的矩形,矩形的边平行于坐标轴,最多能盖住多少个点. 刘汝佳 ...

  4. 线段树+扫描线 HDOJ 5091 Beam Cannon(大炮)

    题目链接 题意: 给出若干个点的坐标,用一个W*H的矩形去覆盖,问最多能覆盖几个点. 思路: 这是2014上海全国邀请赛的题目,以前写过,重新学习扫描线.首先把所有点移到第一象限([0, 40000] ...

  5. hdu 5091(线段树+扫描线)

    上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...

  6. HDU 5091 线段树扫描线

    给出N个点.和一个w*h的矩形 给出N个点的坐标,求该矩形最多能够覆盖多少个点 对每一个点point(x.y)右边生成相应的点(x+w,y)值为-1: 纵向建立线段树,从左到右扫描线扫一遍.遇到点则用 ...

  7. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  8. hdu 1828 线段树扫描线(周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  9. hdu 5091 给定矩形覆盖尽量多点 扫描线+线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=5091 给你10000以内的敌舰的坐标(即分别为x,y),要求用W*H的矩形去围住一个区域,使得这个区域内的敌舰最 ...

随机推荐

  1. Java正则表达式之Matcher介绍

    Matcher方法如下: Matcher方法如下: Matcher appendReplacement(StringBuffer sb, String replacement) 将当前匹配子串替换为指 ...

  2. 使用军哥的lnmp配置虚拟主机,需要注意的是要配置hosts文件

    #使用军哥的lnmp配置虚拟主机,需要注意的是要配置hosts文件(这一点官方没有讲到)具体方法:1.修改hosts文件sudo vim /etc/hosts 2.在hosts文件中新增一行(这里类似 ...

  3. Windows Error Codes

    http://www.briandunning.com/error-codes/?source=Windows Windows Error Codes List All Error Codes | S ...

  4. 解码H264文件的一些基础知识

    这段时间一直在进行编写H264文件的解析类,因此对于H264文件的格式有了初步的了解,官方文档也看了个大概.这篇文章主要是总结了一些为解码H264文件而需要的一些前期知识,话不多说,下面是干货,有些是 ...

  5. SVN版本控制图标未显示或显示异常解决方法

    SVN版本控制图标未显示问题解决方法,刚开始遇到这个问题的时候,好苦恼.经过“千辛万苦”的努力,终于得以解决,分享给大家,希望能帮到各位哦! 工具/原料   SVN安装包 方法/步骤     首先安装 ...

  6. [UE4]C++实现动态加载的问题:LoadClass()和LoadObject()

    http://aigo.iteye.com/blog/2281558 原文作者:@玄冬Wong 相关内容:C++静态加载问题:ConstructorHelpers::FClassFinder()和FO ...

  7. JS 检查是否在微信浏览器

    /** * 检查是否在微信浏览器 * zengkai */ function isWeixinBrowser(){ var ua = navigator.userAgent.toLowerCase() ...

  8. 洛谷P3182 [HAOI2016]放棋子

    P3182 [HAOI2016]放棋子 题目描述 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍的位置不能放棋子),要 ...

  9. IT兄弟连 JavaWeb教程 监听器1

    1  基本概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序 ...

  10. JS中的MOD运算

    最近研究汉诺塔非递归的时候,看到书上写了个MOD,久违啊,感觉好久没看到过了,都忘了怎么用了. 某人:我知道,这不就是取余嘛,直接%就行了. 嗯......,如果是python语言,你说的很对,但是我 ...