結果
| 問題 |
No.1117 数列分割
|
| コンテスト | |
| ユーザー |
Nachia
|
| 提出日時 | 2021-01-04 15:46:10 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,833 ms / 3,000 ms |
| コード長 | 947 bytes |
| コンパイル時間 | 2,253 ms |
| コンパイル使用メモリ | 207,396 KB |
| 最終ジャッジ日時 | 2025-01-17 09:36:34 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 26 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
using LL=long long;
using ULL=unsigned long long;
#define rep(i,n) for(int i=0; i<(n); i++)
const LL INF=1000000000000000;
int N,K,M;
LL A[3001][2];
LL dp[3001][3001][2];
deque<int> dpw[3001][2];
int main(){
cin>>N>>K>>M;
rep(i,N) cin>>A[i][0]; A[N][0]=0;
for(int i=N-1; i>=0; i--) A[i][0]+=A[i+1][0];
rep(i,N+1) A[i][1]=-A[i][0];
rep(t,2) rep(i,N+1) rep(k,K+1) dp[k][i][t]=-INF;
rep(t,2) dp[0][0][t]=A[0][t];
rep(t,2) rep(k,K+1) dpw[k][t]={0};
rep(i,N) rep(k,K){
LL tmp = -INF;
rep(t,2){
if(dpw[k][t].size()) if(dpw[k][t].front()<=i-M) dpw[k][t].pop_front();
if(dpw[k][t].size()) tmp=max(tmp,dp[k][dpw[k][t].front()][t]-A[i+1][t]);
}
rep(t,2){
dp[k+1][i+1][t]=tmp+A[i+1][t];
while(dpw[k+1][t].size()) if(dp[k+1][dpw[k+1][t].back()][t]<=dp[k+1][i+1][t]) dpw[k+1][t].pop_back(); else break;
dpw[k+1][t].push_back(i+1);
}
}
cout<<dp[K][N][0]<<endl;
return 0;
}
Nachia