Maximizing Productivity (USACO Bronze 2024 February)

Maximizing Productivity (USACO Bronze 2024 February)

题目问是否在出发延迟为SS的情况下,可以按时达到VV个农场,就是给定一个SS,需要问有多少个ii满足以下公式(等于或不等关系,把公式写出来,是看出规律和变形的好办法):

ti+S<ci t_i + S < c_i

因为tit_icic_i都是给定的,所以将这个式子变型一下,将tit_icic_i放到一起,就可以预先计算,更容易处理一些:

citi>S c_i - t_i > S

问题变成了:给定cic_itit_i,问有多少个ii满足citi>Sc_i - t_i > S,我们把citic_i-t_i都算出来,排好序,就是一个二分查找的问题了。

二分查找可以不用自己实现,可以用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;
}