結果
問題 | No.1117 数列分割 |
ユーザー |
![]() |
提出日時 | 2020-07-18 21:23:39 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 641 ms / 3,000 ms |
コード長 | 2,577 bytes |
コンパイル時間 | 1,436 ms |
コンパイル使用メモリ | 109,188 KB |
実行使用メモリ | 78,024 KB |
最終ジャッジ日時 | 2024-12-14 07:54:12 |
合計ジャッジ時間 | 7,183 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
#include<iostream>#include<string>#include<cstdio>#include<vector>#include<cmath>#include<algorithm>#include<functional>#include<iomanip>#include<queue>#include<ciso646>#include<random>#include<map>#include<set>#include<complex>#include<bitset>#include<stack>#include<unordered_map>#include<utility>#include<tuple>using namespace std;typedef long long ll;typedef unsigned int ui;const ll mod = 1000000007;const ll INF = (ll)1000000007 * 1000000007;typedef pair<int, int> P;#define stop char nyaa;cin>>nyaa;#define rep(i,n) for(int i=0;i<n;i++)#define per(i,n) for(int i=n-1;i>=0;i--)#define Rep(i,sta,n) for(int i=sta;i<n;i++)#define Per(i,sta,n) for(int i=n-1;i>=sta;i--)#define rep1(i,n) for(int i=1;i<=n;i++)#define per1(i,n) for(int i=n;i>=1;i--)#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)typedef long double ld;const ld eps = 1e-8;const ld pi = acos(-1.0);typedef pair<ll, ll> LP;int dx[4]={1,-1,0,0};int dy[4]={0,0,1,-1};int n,m,k;ll a[3010],S[3010];ll dp[3010][3010];deque<int> que1[3010],que2[3010];void solve(){cin >> n >> k >> m;rep(i,n+1){rep(j,k){dp[j][i]=-INF;}}rep(i,n){cin >> a[i];}rep(i,n){S[i+1]=S[i]+a[i];}dp[0][0]=0;rep(i,k){que1[i].push_back(0);que2[i].push_back(0);}Rep(i,1,n+1){Rep(j,1,k){//for(int t:que1[j-1]){cout << t << " ";}//cout << "" << endl;//cout << que1[j-1][0] << " " << que2[j-1][0] << endl;if(que1[j-1][0]==i-m-1) que1[j-1].pop_front();if(que2[j-1][0]==i-m-1) que2[j-1].pop_front();ll res1=-INF;if(!que1[j-1].empty())res1=dp[j-1][que1[j-1][0]]-S[que1[j-1][0]];ll res2=-INF;if(!que1[j-1].empty())res2=dp[j-1][que2[j-1][0]]+S[que2[j-1][0]];//cout << que1[j-1][0] << " " << que2[j-1][0] << endl;//cout << res1 << " " << res2 << endl;//cout << que1[j].back() << endl;dp[j][i]=max(res1+S[i],res2-S[i]);//cout << i << " " << j << " " << dp[j][i] << endl;}Rep(j,1,k){while(dp[j][que1[j].back()]-S[que1[j].back()]<=dp[j][i]-S[i]){que1[j].pop_back();if(que1[j].empty()) break;}que1[j].push_back(i);while(dp[j][que2[j].back()]+S[que2[j].back()]<=dp[j][i]+S[i]){que2[j].pop_back();if(que2[j].empty()) break;}que2[j].push_back(i);}}ll ans=0;Rep(i,n-m,n){ans=max(ans,dp[k-1][i]+abs(S[n]-S[i]));}cout << ans << endl;}int main(){ios::sync_with_stdio(false);cin.tie(0);cout << fixed << setprecision(50);solve();}