結果
問題 | No.1117 数列分割 |
ユーザー |
👑 ![]() |
提出日時 | 2020-07-18 08:04:49 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 168 ms / 3,000 ms |
コード長 | 2,127 bytes |
コンパイル時間 | 2,163 ms |
コンパイル使用メモリ | 203,500 KB |
最終ジャッジ日時 | 2025-01-12 00:06:27 |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
#define _USE_MATH_DEFINES#include <bits/stdc++.h>using namespace std;#define FOR(i,m,n) for(int i=(m);i<(n);++i)#define REP(i,n) FOR(i,0,n)#define ALL(v) (v).begin(),(v).end()using ll = long long;const int INF = 0x3f3f3f3f;const ll LINF = 0x3f3f3f3f3f3f3f3fLL;const double EPS = 1e-8;const int MOD = 1000000007;// const int MOD = 998244353;const int dy[] = {1, 0, -1, 0}, dx[] = {0, -1, 0, 1};const int dy8[] = {1, 1, 0, -1, -1, -1, 0, 1}, dx8[] = {0, -1, -1, -1, 0, 1, 1, 1};template <typename T, typename U> inline bool chmax(T &a, U b) { return a < b ? (a = b, true) : false; }template <typename T, typename U> inline bool chmin(T &a, U b) { return a > b ? (a = b, true) : false; }struct IOSetup {IOSetup() {cin.tie(nullptr);ios_base::sync_with_stdio(false);cout << fixed << setprecision(20);}} iosetup;template <typename T>vector<T> slide_min(const vector<T> &a, int len) {int n = a.size();vector<T> res(n - len + 1);deque<T> deq;REP(i, n) {while (!deq.empty() && a[deq.back()] >= a[i]) deq.pop_back();deq.emplace_back(i);if (i + 1 >= len) {int left = i + 1 - len;res[left] = a[deq.front()];if (deq.front() == left) deq.pop_front();}}return res;}int main() {int n, k, m; cin >> n >> k >> m;vector<int> a(n); REP(i, n) cin >> a[i];vector r(n + 1, 0LL), dp(n + 1, -LINF);for (int i = n - 1; i >= 0; --i) r[i] = r[i + 1] + a[i];dp[0] = 0;while (k--) {vector nx(n + 1, -LINF);deque<int> mn, mx;REP(i, n) {while (!mn.empty() && dp[mn.back()] - r[mn.back()] <= dp[i] - r[i]) mn.pop_back();mn.emplace_back(i);chmax(nx[i + 1], dp[mn.front()] - r[mn.front()] + r[i + 1]);if (mn.front() == i + 1 - m) mn.pop_front();while (!mx.empty() && dp[mx.back()] + r[mx.back()] <= dp[i] + r[i]) mx.pop_back();mx.emplace_back(i);chmax(nx[i + 1], dp[mx.front()] + r[mx.front()] - r[i + 1]);if (mx.front() == i + 1 - m) mx.pop_front();}dp.swap(nx);// REP(i, n + 1) cout << dp[i] << " \n"[i == n];}cout << dp[n] << '\n';return 0;}