hdu5091 Beam Cannon(扫描线,线段树)

题意:

在二维坐标系中有n个点,给定这n个点的坐标(x,y),
现在你有一个w*h的框,问最多能框到多少个点。

数据范围:n<=1e4,-2e4<=x,y<=2e4,1<=w,h<=4e4

解法:
坐标可能是负数,方便起见加上一个base变为正数

扫描线,从左到右用竖线扫描横坐标,
如果存在点(x,y),那么在x处加入这个点,在x+w+1处减去这个点.

然后问题变为在固定的横坐标x下,长度为h最多能覆盖多少个点.
发现这样还是很难快速计算,因为需要枚举端点.

一个巧妙的做法:
令线段树的每个位置y表示[y,y-h]能覆盖到的点数量,

那么考虑点(x,y)的y在哪些位置上有贡献,
显然y在[y,y+h]内有贡献,
因此对于点(x,y),将线段树的[y,y+h]位置+1
那么查询就变成查询整颗线段树的最大值
code:
#include<bits/stdc++.h>
using namespace std;
const int maxm=2e5+5;
struct Trie{
    int a[maxm<<2];
    int laz[maxm<<2];
    void pushup(int node){
        a[node]=max(a[node*2],a[node*2+1]);
    }
    void pushdown(int node){
        if(laz[node]){
            laz[node*2]+=laz[node];
            laz[node*2+1]+=laz[node];
            a[node*2]+=laz[node];
            a[node*2+1]+=laz[node];
            laz[node]=0;
        }
    }
    void update(int st,int ed,int val,int l,int r,int node){
        if(st<=l&&ed>=r){
            a[node]+=val;
            laz[node]+=val;
            return ;
        }
        pushdown(node);
        int mid=(l+r)/2;
        if(st<=mid)update(st,ed,val,l,mid,node*2);
        if(ed>mid)update(st,ed,val,mid+1,r,node*2+1);
        pushup(node);
    }
}t;
struct Node{
    int x,y,f;
    bool operator<(const Node& a)const{
        if(x!=a.x)return x<a.x;
        return f<a.f;
    }
}e[maxm<<1];
int n,w,h;
signed main(){
    while(scanf("%d",&n)!=EOF&&n>=0){
        scanf("%d%d",&w,&h);
        int tot=0;
        int lc=1e9,rc=0;
        for(int i=1;i<=n;i++){
            int x,y;scanf("%d%d",&x,&y);
            x+=20005,y+=20005;
            lc=min(lc,y);
            rc=max(rc,y);
            e[++tot]={x,y,1};
            e[++tot]={x+w+1,y,-1};
        }
        sort(e+1,e+1+tot);
        int ans=0;
        for(int i=1;i<=tot;i++){
            int l=max(lc,e[i].y);
            int r=min(rc,e[i].y+h);
            t.update(l,r,e[i].f,lc,rc,1);
            ans=max(ans,t.a[1]);
        }
        printf("%d\n",ans);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值