Maximizing Productivity (USACO Bronze 2024 February)
题目问是否在出发延迟为的情况下,可以按时达到个农场,就是给定一个,需要问有多少个满足以下公式(等于或不等关系,把公式写出来,是看出规律和变形的好办法):
因为和都是给定的,所以将这个式子变型一下,将和放到一起,就可以预先计算,更容易处理一些:
问题变成了:给定和,问有多少个满足,我们把都算出来,排好序,就是一个二分查找的问题了。
二分查找可以不用自己实现,可以用lower_bound()/upper_bound()来实现(这里是用upper_bound合适)。
#include <cstdio>
#include <algorithm>
#include <functional>
#include <vector>
#include <cstring>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
int n, Q;
int c[200005];
int main() {
scanf("%d %d", &n, &Q);
for (int i = 0; i < n; i++)
scanf("%d", &c[i]);
for (int i = 0; i < n; i++) {
int t;
scanf("%d", &t);
c[i] -= t;
}
sort(c, c+n);
for (int q = 0; q < Q; q++) {
int S, v;
scanf("%d %d", &v, &S);
int ans = upper_bound(c, c+n, S) - c;
if (n-ans >= v)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}