Fishermen(2018 ICPC SouthEastern European)

 

Input
8 4 4
7 2
3 3
4 5
5 1
2 2
1 4
8 4
9 4
6 1 4 9
Output
2
2
3
2

题意:有n条鱼,m个渔夫,且这m个渔夫都在横坐标轴上,每个渔夫都有一个长度为L的鱼竿,当鱼和渔夫距离小于或等于L时,鱼能被钓到。并且渔夫(x,0)与鱼(a,b)的距离满足如下公式   |a − x| + b.      式子中x为渔夫的横坐标,(a,b)为鱼的坐标。

思路: 我们可以先把渔夫的位置排个序,然后遍历所有的鱼,每一条鱼能够被可以被抓都在x轴有一个范围,通过二分,在渔夫中找到最左的和最右的,然后差分一下,最后求个前缀和就可以得出答案

用到的知识:

简单来讲就是: a是数组,n是数组里面的个数,x是需要比较的数,其中a数组是从1开始计数,用之前需要对a数组排序。
lower_bound(a+1, a+n+1,x)-a是返回一个非递减序列[first, last)中的第一个大于等于值x的位置

upper_bound(a+1, a+n+1, x)-a算法返回一个非递减序列[first, last)中第一个大于x的位置

这里写图片描述

 

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#define MAX 0x3f3f3f3f
using namespace std;
typedef long long ll;
const double PI = acos(-1);
const int M=2e5+10;
#define inf 0x3f3f3f
struct Fish
{
    int x;
    int y;
}fish[M];
struct Fishman
{
    int pos;//渔夫的位置
    int before;//排序前位置的编号
    int after;//排序后位置的编号
    bool operator <(const Fishman &bb) const{
        return pos<bb.pos;
    }
}fishman[M];
int sum[M],ans[M];
int main()
{
    ll n,m,l,i,j;
    scanf("%d%d%d",&n,&m,&l);
    for(i=1;i<=n;i++)
        scanf("%d%d",&fish[i].x,&fish[i].y);
    for(i=1;i<=m;i++)
    {
        scanf("%d",&fishman[i].pos);
        fishman[i].before=i;
    }
    sort(fishman,fishman+m+1);
    for(i=1;i<=m;i++)
        fishman[i].after=i;
    for(i=1;i<=n;i++)
    {
        if(fish[i].y-l>0)
            continue;

        Fishman temp;
        //x-(l-y) ~ x+(l-y)
        temp.pos=fish[i].x-l+fish[i].y;
        int xx=lower_bound(fishman+1,fishman+m+1,temp)-fishman;
        temp.pos=fish[i].x+l-fish[i].y;
        int yy=upper_bound(fishman,fishman+m+1,temp)-fishman;
        sum[xx]++;
        sum[yy]--;
    }
    for(int i=1;i<=m;i++)
    {
        sum[i]+=sum[i-1];
        ans[fishman[i].before]=sum[fishman[i].after];
    }
    for(i=1;i<=m;i++)
        printf("%d\n",ans[i]);
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
错误创建目录。这个错误通常出现在数据库启动或保存查询语句时。根据引用\[1\]和引用\[2\]的信息,这个错误可能是由于指定的目录不存在或无法创建导致的。在引用\[2\]中提到,在Navicat上解决这个问题的方法是通过编辑连接的高级设置来更改目录地址。同样,在引用\[3\]中也提到了类似的问题,当搭建数据库的备库时,可能会出现这个错误。在这种情况下,需要检查备库的参数文件是否正确配置,并确保指定的目录存在。如果目录不存在,可以尝试手动创建它。总之,错误创建目录的原因可能是由于目录不存在或权限不足导致的,解决方法是更改目录地址或手动创建目录。 #### 引用[.reference_title] - *1* *3* [诡异的错误:ORA-48141: error creating directory during ADR initialization--原来是单引号惹的祸](https://blog.csdn.net/qianglei6077/article/details/89011380)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [保存SQL语句,遇见Navicat for MySQL Error creating directory](https://blog.csdn.net/Fishermen_sail/article/details/116599560)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值