結果
問題 | No.1117 数列分割 |
ユーザー |
![]() |
提出日時 | 2020-07-18 01:39:28 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 257 ms / 3,000 ms |
コード長 | 3,125 bytes |
コンパイル時間 | 3,568 ms |
コンパイル使用メモリ | 210,484 KB |
最終ジャッジ日時 | 2025-01-11 23:43:21 |
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
#include <bits/stdc++.h>using namespace std;#define modulo 1000000007#define mod(mod_x) ((((long long)mod_x+modulo))%modulo)#define Inf 1000000000000000000template <typename T,typename F>struct SWAG{F func;T init_value;vector<pair<T,T>> X,Y;SWAG(F f,T iv):func(f){init_value = iv;}void push_front(T x){if(X.empty())X.push_back({x,x});else X.push_back({x,func(x,X.back().second)});}void push_back(T x){if(Y.empty())Y.push_back({x,x});else Y.push_back({x,func(Y.back().second,x)});}void pop_front(){if(X.empty()){int n = Y.size();vector<T> t;for(int i=0;i<n/2;i++){t.push_back(Y.back().first);Y.pop_back();}while(!Y.empty()){push_front(Y.back().first);Y.pop_back();}while(!t.empty()){push_back(t.back());t.pop_back();}if(!X.empty())X.pop_back();}else{X.pop_back();}}void pop_back(){if(Y.empty()){int n = X.size();vector<T> t;for(int i=0;i<n/2;i++){t.push_back(X.back().first);X.pop_back();}while(!X.empty()){push_back(X.back().first);X.pop_back();}while(!t.empty()){push_front(t.back());t.pop_back();}if(!Y.empty())Y.pop_back();}else{Y.pop_back();}}T get(){T ret = init_value;if(!X.empty())ret = func(ret,X.back().second);if(!Y.empty())ret = func(ret,Y.back().second);return ret;}T front(){if(!X.empty())return X.back().first;if(!Y.empty())return Y[0].first;return init_value;}T back(){if(!Y.empty())return Y.back().first;if(!X.empty())return X[0].first;return init_value;}int size(){return X.size()+Y.size();}};int main(){int N,K,M;cin>>N>>K>>M;vector<long long> A(N);for(int i=0;i<N;i++)cin>>A[i];/*N=3000,M=3000,K=3000;A.resize(N,3);*/vector<long long> S(N+1,0);for(int i=1;i<=N;i++){S[i] = S[i-1] + A[i-1];}auto f = [](pair<long long,int> a,pair<long long,int> b){return max(a,b);};vector<SWAG<pair<long long,int>,decltype(f)>> Sm(K+1,SWAG<pair<long long,int>,decltype(f)>(f,make_pair(-Inf,0))),Sp(K+1,SWAG<pair<long long,int>,decltype(f)>(f,make_pair(-Inf,0)));vector<long long> dp(K+1,-Inf);dp[0] = 0LL;Sm[0].push_back(make_pair(0LL,0));Sp[0].push_back(make_pair(0LL,0));for(int i=1;i<=N;i++){vector<long long> ndp(K+1,-Inf);for(int j=1;j<=K;j++){if(Sm[j-1].size()!=0&&Sm[j-1].front().second+M<i){Sm[j-1].pop_front();}if(Sp[j-1].size()!=0&&Sp[j-1].front().second+M<i){Sp[j-1].pop_front();}ndp[j] = max(Sm[j-1].get().first + S[i],Sp[j-1].get().first - S[i]);}for(int j=1;j<=K;j++){if(ndp[j]<0)continue;while(true){if(Sm[j].size()==0)break;if(Sm[j].back().first<=ndp[j]-S[i]){Sm[j].pop_back();}else break;}while(true){if(Sp[j].size()==0)break;if(Sp[j].back().first<=ndp[j]+S[i]){Sp[j].pop_back();}else break;}Sm[j].push_back(make_pair(ndp[j]-S[i],i));Sp[j].push_back(make_pair(ndp[j]+S[i],i));}swap(dp,ndp);}cout<<dp.back()<<endl;return 0;}