CF734C题解报告
这么水的二分居然还能交题解。。。
题意讲的还是很清楚的,我就不重复了。
思路很简单,分两种情况讨论。只选一种,或选两种。
只选一种就不说了,自己想。
对于选两种的情况。我们可以枚举第一种法力值为 \(b_i\) 的情况,找到法力值 \(\le s - b_i\) 的第二种魔法,又 \(c, d\) 均为单调不减,则当 \(d_i\) 越大时 \(c_i\) 越大,所以只需考虑取最后一个法力值 \(\le s - b_i\) 的魔法即可,可以用二分查找。
你们最喜欢的代码:
#include<bits/stdc++.h>
#define int long long//不开 long long 见祖宗
using namespace std;
const int N = 2e5 + 1;
int n, m, x, s, k, a[N], b[N], c[N], d[N], ans;
signed main(){
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> m >> k >> x >> s;
ans = n * x;
for(int i = 1; i <= m; i++)
cin >> a[i];
for(int i = 1; i <= m; i++)
cin >> b[i];
for(int i = 1; i <= k; i++)
cin >> c[i];
for(int i = 1; i <= k; i++)
cin >> d[i];
for(int i = 1; i <= m; i++)
if(b[i] <= s) ans = min(ans, a[i] * n);
for(int i = 1; i <= k; i++)
if(d[i] <= s) ans = min(ans, max(0ll, n - c[i]) * x);
//只选一种
for(int i = 1; i <= m; i++){
int x = upper_bound(d + 1, d + k + 1, s - b[i]) - d - 1;
if(x <= 0) continue;
ans = min(ans, a[i] * max(0ll, n - c[x]));
}
//选两种
cout << ans;
return 0;
}