Gym - 101964E Fishermen(差分区间修改)

Posted tianwell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gym - 101964E Fishermen(差分区间修改)相关的知识,希望对你有一定的参考价值。

技术图片

题目如上:

题意:题意: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;
}

 

以上是关于Gym - 101964E Fishermen(差分区间修改)的主要内容,如果未能解决你的问题,请参考以下文章

Gym Gym 101147G 第二类斯特林数

OpenAI Gym 入门与提高 Gym环境构建与最简单的RL agent

强化学习 平台 openAI 的 gym 安装 (Ubuntu环境下如何安装Python的gym模块)

openai/gym 中各种环境(Env)的参数解释

2016 USP-ICMC-Codeforces-Gym101063C-Sleep Buddies Gym101063F-Bandejao Gym101063J-The Keys

gym 搭建 RL 环境