【枚举+贪心】CF1409 E

叁歲伎倆 2024-03-01 07:49 164阅读 0赞

Problem - E - Codeforces

题意:

692b4193a8eb4cbf9d366556390ec556.png

316811956368434ca49ba349a5e9d9aa.png

思路:

首先贪心的结论很明显,选两个贡献最大的区间

还有一个结论,这两个区间没有交点

然后就能直接做了,枚举一个区间,然后找这个区间后缀的最大贡献的区间即可,所以需要维护一个后缀贡献的最大值

Code:

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. constexpr int N = 2e5 + 10;
  5. constexpr int mod = 998244353;
  6. int n, k;
  7. int x[N], y[N];
  8. int dp[N];
  9. int mx[N];
  10. void solve() {
  11. std::cin >> n >> k;
  12. for (int i = 0; i <= n + 1; i ++) {
  13. mx[i] = 0;
  14. dp[i] = 0;
  15. }
  16. for (int i = 1; i <= n; i ++) std::cin >> x[i];
  17. for (int i = 1; i <= n; i ++) std::cin >> y[i];
  18. std::sort(x + 1, x + 1 + n);
  19. for (int i = 1; i <= n; i ++) {
  20. int r = std::upper_bound(x + 1, x + 1 + n, x[i] + k) - x - 1;
  21. dp[i] = r - i + 1;
  22. }
  23. for (int i = n; i >= 1; i --) {
  24. mx[i] = std::max(mx[i + 1], dp[i]);
  25. }
  26. int ans = 0;
  27. for (int i = 1; i <= n; i ++) {
  28. ans = std::max(ans, dp[i] + mx[i + dp[i]]);
  29. }
  30. std::cout << ans << "\n";
  31. }
  32. signed main() {
  33. std::ios::sync_with_stdio(false);
  34. std::cin.tie(nullptr);
  35. int t = 1;
  36. std::cin >> t;
  37. while(t --) {
  38. solve();
  39. }
  40. return 0;
  41. }

发表评论

表情:
评论列表 (有 0 条评论,164人围观)

还没有评论,来说两句吧...

相关阅读