CF734C题解报告

这么水的二分居然还能交题解。。。

洛谷题目传送门CF题目传送门

题意讲的还是很清楚的,我就不重复了。

思路很简单,分两种情况讨论。只选一种,或选两种。

只选一种就不说了,自己想。

对于选两种的情况。我们可以枚举第一种法力值为 \(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;
}
posted @ 2026-02-02 21:32  tangtianyao0123  阅读(2)  评论(0)    收藏  举报