結果
問題 | No.1117 数列分割 |
ユーザー | 沙耶花 |
提出日時 | 2020-07-18 01:39:28 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 195 ms / 3,000 ms |
コード長 | 3,125 bytes |
コンパイル時間 | 2,648 ms |
コンパイル使用メモリ | 219,108 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-05-07 14:45:18 |
合計ジャッジ時間 | 5,086 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 19 ms
5,376 KB |
testcase_04 | AC | 17 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 2 ms
5,376 KB |
testcase_07 | AC | 2 ms
5,376 KB |
testcase_08 | AC | 17 ms
5,376 KB |
testcase_09 | AC | 6 ms
5,376 KB |
testcase_10 | AC | 18 ms
5,376 KB |
testcase_11 | AC | 64 ms
5,376 KB |
testcase_12 | AC | 63 ms
5,376 KB |
testcase_13 | AC | 76 ms
5,376 KB |
testcase_14 | AC | 95 ms
5,376 KB |
testcase_15 | AC | 98 ms
5,376 KB |
testcase_16 | AC | 132 ms
5,376 KB |
testcase_17 | AC | 19 ms
5,376 KB |
testcase_18 | AC | 79 ms
5,376 KB |
testcase_19 | AC | 195 ms
5,376 KB |
testcase_20 | AC | 114 ms
5,376 KB |
testcase_21 | AC | 187 ms
5,376 KB |
testcase_22 | AC | 188 ms
5,376 KB |
testcase_23 | AC | 186 ms
5,376 KB |
testcase_24 | AC | 182 ms
5,376 KB |
testcase_25 | AC | 184 ms
5,376 KB |
testcase_26 | AC | 2 ms
5,376 KB |
testcase_27 | AC | 9 ms
5,376 KB |
testcase_28 | AC | 11 ms
5,376 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; #define modulo 1000000007 #define mod(mod_x) ((((long long)mod_x+modulo))%modulo) #define Inf 1000000000000000000 template <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; }