• Gym


    题目如上:

    题意:题意:n条鱼,每条鱼有自己的坐标
    有m个捕鱼人,每一个捕鱼人都给出x坐标(y坐标默认为0)
    每一个捕鱼人都有一个范围 l ,在范围内都能捕鱼,距离为 |a-x|+b

    问最后每个捕鱼人对应可以捕捉到多少条鱼

    思路:

    其实我们稍微思考以下就可以知道:看一下样例中给的图


    (1)我们会发现 l 以上的所有鱼都不可能被捕到。 ( fish.y > l ) 就不能捕到

    (2)如果从捕鱼人的角度去看的话,我们可能需要两重循环,(对人和鱼都遍历)

    但是如果计算鱼的贡献的话,我们可以通过计算找到图上 【L,R】 贡献范围,那么只需要对鱼遍历一次然后对区间内进行运算即可。

    由于题目中给出的人在x轴的位置是随机的,所以还要先记录一次id顺序,最后在映射一次输出结果。

    #include <bits/stdc++.h>
    using namespace std;
    typedef  long long ll;
    const int maxn = 2e5+7;
    struct fish
    {
        int x,y;
    }fishes[maxn];
    struct fm
    {
        int x,id;
        bool operator <(const fm &a)const 
        {
            return x<a.x;
        }
        
    }fishmen[maxn];
    int sum[maxn],ans[maxn];
    int main(){
        int n,m,l;
        scanf("%d %d %d",&n,&m,&l);
        for (int i=1;i<=n;i++)
            scanf("%d %d",&fishes[i].x,&fishes[i].y);
        for (int i=1;i<=m;i++) {
            scanf("%d",&fishmen[i].x);
            fishmen[i].id=i;//输入的顺序 
        }
        sort(fishmen+1,fishmen+m+1);
        for (int i=1;i<=n;i++){
            if (fishes[i].y-l>0) continue;
            fm tmp;
            tmp.x=fishes[i].x-l+fishes[i].y;
            int L=lower_bound(fishmen+1,fishmen+m+1,tmp)-fishmen;
            tmp.x=fishes[i].x+l-fishes[i].y;
            int R=upper_bound(fishmen+1,fishmen+m+1,tmp)-fishmen;
            sum[L]++;
            sum[R]--;
        }
        for (int i=1;i<=m;i++){
            sum[i]+=sum[i-1];
            ans[fishmen[i].id]=sum[i];
        }
        for (int i=1;i<=m;i++) printf("%d
    ",ans[i]);
        return 0;
    }
  • 相关阅读:
    java TopK算法
    夫妻过河问题
    Java中数据存储分配
    STM32与ARM代码执行过程
    C中gets()函数与scanf()函数说明
    MRTG开源监控安装手册
    mysql笔记
    windows调用ubuntu下的sublimeText2环境搭建
    linux性能优化
    测试那些事儿—软测必备的Linux知识(一)
  • 原文地址:https://www.cnblogs.com/Tianwell/p/11778494.html
Copyright © 2020-2023  润新知