对天数进行二分,右界直接1e18会溢出

#include <iostream>
#include <algorithm>
#include <string.h>
#include <vector>
#include <cmath>
using namespace std;
const int N = 2 * 1e6 + 10;
typedef long long ll;

int a[N];
int h[N];
ll c[N];
ll n, S, L;
ll maxn;
ll bsearch(ll l, ll r);
bool check(ll x);
int main() {
    scanf("%lld%lld%lld", &n, &S, &L);
    for (ll i = 0; i < n; i++) {
        scanf("%d", &h[i]);
    }
    for (ll i = 0; i < n; i++) {
        scanf("%d", &a[i]);
        maxn = max(maxn, max(L, S) / a[i]);
    }
    printf("%lld\n", bsearch(0, maxn));
    return 0;
}
ll bsearch(ll l, ll r) {
    while (l < r) {
        ll mid = l + r >> 1;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    return l;
}
bool check(ll x) {
    ll sum = 0;
    for (int i = 0; i < n; i++) {
        c[i] = h[i] + x * a[i];
    }
    sort(c, c + n);
    for (int i = n - 1; i >= 0; i--) {
        if (c[i] < L) break;
        if (sum >= S) break;
        sum += c[i];
    }
    if (sum >= S) return true;
    else return false;
}