题意:
给出n条鱼的坐标,m个渔夫都在x轴,给出m个渔夫的坐标,以及鱼竿的长度L,鱼到渔夫的距离是
a
b
s
(
x
鱼
−
x
渔
夫
)
+
y
鱼
{abs(x_鱼 - x_{渔夫})+y_鱼}
abs(x鱼−x渔夫)+y鱼
思路:
找到每个鱼对应的能被捕到的范围,二分找到离范围最近的两个渔夫,用前缀和。
代码:
#include <bits/stdc++.h>
using namespace std;
#define memset(a,b) memset(a,b,sizeof(a))
#define llu unsigned long long
#define inf 0x3f3f3f3f
const int maxn=1e5+10;
struct node{
int x;
int y;
}a[maxn*2];
struct nodd{
int num,pos,num1;
bool operator <(const nodd &A) const {
return pos < A.pos;
}
}b[maxn*2];
int sum[maxn*2];
int ans[maxn*2];
int main()
{
int n,m,l;
scanf("%d %d %d",&n,&m,&l);
for(int i=1;i<=n;i++){
scanf("%d %d",&a[i].x,&a[i].y);
}
for(int i=1;i<=m;i++)
scanf("%d",&b[i].pos),b[i].num=i;
sort(b+1,b+m+1);
for(int i=1;i<=m;i++)
b[i].num1=i;
for(int i=1;i<=n;i++){
if(l < a[i].y)
continue;
nodd tmp2;
tmp2.pos=a[i].x+l-a[i].y; //范围的右边界
nodd tmp1;
tmp1.pos=a[i].x-l+a[i].y; //范围的左边界
int x1=lower_bound(b+1,b+1+m,tmp1)-b; //返回第一个大于等于的
int x2=upper_bound(b+1,b+1+m,tmp2)-b; //返回第一个大于的
sum[x1]++;
sum[x2]--;
}
for(int i=1;i<=m;i++)
sum[i] +=sum[i-1],ans[b[i].num]=sum[i];
for(int i=1;i<=m;i++){
printf("%d\n",ans[i]);
}
return 0;
}