对着题解和讨论区改了好久……
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
using namespace std;
using ll = unsigned long long;
const int kMaxN = 2e5 + 20, kInf = (((1 << 30) - 1) << 1) + 1;
ll n, s, l, h[kMaxN], a[kMaxN], mid;
bool C(int mid) {
ll ans = 0;
for (int i = 1; i <= n; ++ i) {
(h[i] + a[i] * mid >= l) && (ans += h[i] + a[i] * mid);
if (ans >= s) {
return 1;
}
}
return (ans >= s);
}
int main() {
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
cin >> n >> s >> l;
for (int i = 1; i <= n; ++ i) {
cin >> h[i];
}
for (int i = 1; i <= n; ++ i) {
cin >> a[i];
}
if (C(0)) {
return cout << 0 << '\n', 0;
}
ll l = 0, r = max(s, l), ans = 0;
for (; l <= r; ) {
mid = l + r >> 1;
(C(mid)? r = mid - 1 : l = mid + 1);
(C(mid)) && (ans = mid);
}
cout << ans << '\n';
return 0;
}