求大佬
查看原帖
求大佬
637788
kimi0705楼主2023/7/16 18:04

从loj跑来问

// Time: 2023-07-16 00:30:23
// Problem: #10177. 「一本通 5.5 例 3」修剪草坪
// Contest: LibreOJ
// URL: https://loj.ac/p/10177
// Memory Limit: 512 MB
// Time Limit: 1000 ms
// Author: Zhong Jiaxuan
// Luogu: 637788
// Email: zhongjiaxuankimi@qq.com
// Tips:
//   - INT_MAX = 2147483647
//   - INT_MIN = -2147483648
// Tag:
//
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define int long long
#define db double
using namespace std;
int n, k;
vector<int> arr, sum;
vector<int> dp1, dp2;
deque<int> de;
signed main() {

  cin >> n >> k;
  arr.resize(n);
  dp1.resize(n);
  dp2.resize(n);
  for (int &i : arr)
    cin >> i;
  sum.push_back(arr[0]);
  for (int i = 1; i < n; i++)
    sum.push_back(sum[i - 1] + arr[i]);
  for (int i = 0; i < n; i++) {
    if (i == 0)
      dp1[i] = 0;
    else
      dp1[i] = max(dp1[i - 1], dp2[i - 1]);
    while (de.size() && de.front() < i - k)
      de.pop_front();
    dp2[i] = sum[i] + (de.size() ? dp1[de.front()] - sum[de.front()] : 0);
    while (de.size() && dp1[de.back()] - sum[de.back()] <= dp1[i] - sum[i])
      de.pop_back();
    de.push_back(i);
  }
  for (int i : dp1)
    cout << i << ' ';
  cout << endl;
  for (int i : dp2)
    cout << i << ' ';
  cout << endl;
  cout << max(dp1[n - 1], dp2[n - 1]);
  return 0;
}
2023/7/16 18:04
加载中...