和队友练习,拉了一套国外的区域赛题来做,写了两道题回寝室了,感觉还能够再过一题B的
E - Fishermen
n条鱼有每个鱼的x、y坐标,m个渔夫有m个x轴上的坐标,每个渔夫能钓到|a - x| + y <= l,其中a,b为鱼的坐标,x为渔夫的坐标,l是题目给出的鱼竿长度,求每个渔夫能钓到的鱼数
考虑预处理鱼或者渔夫,发现预处理鱼更简单,将鱼能被钓起来的x坐标左右端点预处理出来,然后对左端点大小排序。
然后渔夫可能输入是乱序的,我们也将渔夫坐标排序;现在就要考虑怎么维护每个渔夫能钓到鱼数量了,用一个小顶堆维护,每次加入鱼的左端点小于等于人的坐标,去判断右端点满足大于等于认得坐标,一次O(n)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5e5;
struct fish {
int l, r;
fish() {}
fish(int a, int b) : l(a), r(b) {}
bool operator <(const fish& x) const {
return l == x.l ? r < x.r : l < x.l;
}
} F[maxn];
struct peo {
int id, x;
bool operator <(const peo& a) const {
return x < a.x;
}
} P[max