結果
問題 | No.1117 数列分割 |
ユーザー |
![]() |
提出日時 | 2020-07-19 11:30:17 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 943 ms / 3,000 ms |
コード長 | 5,956 bytes |
コンパイル時間 | 3,294 ms |
コンパイル使用メモリ | 207,168 KB |
最終ジャッジ日時 | 2025-01-12 00:48:16 |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
#include <bits/stdc++.h>using namespace std;#define int long long#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)#define rrep(i,n) for(int (i)=((n)-1);(i)>=0;(i)--)#define itn int#define miele(v) min_element(v.begin(), v.end())#define maele(v) max_element(v.begin(), v.end())#define SUM(v) accumulate(v.begin(), v.end(), 0LL)#define lb(a, key) lower_bound(a.begin(),a.end(),key)#define ub(a, key) upper_bound(a.begin(),a.end(),key)#define COUNT(a, key) count(a.begin(), a.end(), key)#define BITCOUNT(x) __builtin_popcount(x)#define pb push_back#define all(x) (x).begin(),(x).end()#define F first#define S secondusing P = pair <int,int>;using WeightedGraph = vector<vector <P>>;using UnWeightedGraph = vector<vector<int>>;using Real = long double;using Point = complex<Real>; //Point and Vector2d is the same!using Vector2d = complex<Real>;const long long INF = 1LL << 60;const int MOD = 1000000007;const double EPS = 1e-15;const double PI=3.14159265358979323846;template <typename T>int getIndexOfLowerBound(vector <T> &v, T x){return lower_bound(v.begin(),v.end(),x)-v.begin();}template <typename T>int getIndexOfUpperBound(vector <T> &v, T x){return upper_bound(v.begin(),v.end(),x)-v.begin();}template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }#define DUMPOUT cerr#define repi(itr, ds) for (auto itr = ds.begin(); itr != ds.end(); itr++)istream &operator>>(istream &is, Point &p) {Real a, b; is >> a >> b; p = Point(a, b); return is;}template <typename T, typename U>istream &operator>>(istream &is, pair<T,U> &p_var) {is >> p_var.first >> p_var.second;return is;}template <typename T>istream &operator>>(istream &is, vector<T> &vec) {for (T &x : vec) is >> x;return is;}template <typename T, typename U>ostream &operator<<(ostream &os, pair<T, U> &pair_var) {DUMPOUT<<'{';os << pair_var.first;DUMPOUT<<',';os << " "<< pair_var.second;DUMPOUT<<'}';return os;}template <typename T>ostream &operator<<(ostream &os, vector<T> &vec) {DUMPOUT<<'[';for (int i = 0; i < vec.size(); i++)os << vec[i] << (i + 1 == vec.size() ? "" : " ");DUMPOUT<<']';return os;}template <typename T>ostream &operator<<(ostream &os, vector<vector<T>> &df) {for (auto& vec : df) os<<vec;return os;}template <typename T, typename U>ostream &operator<<(ostream &os, map<T, U> &map_var) {DUMPOUT << "{";repi(itr, map_var) {os << *itr;itr++;if (itr != map_var.end()) DUMPOUT << ", ";itr--;}DUMPOUT << "}";return os;}template <typename T>ostream &operator<<(ostream &os, set<T> &set_var) {DUMPOUT << "{";repi(itr, set_var) {os << *itr;itr++;if (itr != set_var.end()) DUMPOUT << ", ";itr--;}DUMPOUT << "}";return os;}void print() {cout << endl;}template <class Head, class... Tail>void print(Head&& head, Tail&&... tail) {cout << head;if (sizeof...(tail) != 0) cout << " ";print(forward<Tail>(tail)...);}void dump_func() {DUMPOUT << '#'<<endl;}template <typename Head, typename... Tail>void dump_func(Head &&head, Tail &&... tail) {DUMPOUT << head;if (sizeof...(Tail) > 0) DUMPOUT << ", ";dump_func(std::move(tail)...);}#ifdef DEBUG_#define DEB#define dump(...) \DUMPOUT << " " << string(#__VA_ARGS__) << ": " \<< "[" << to_string(__LINE__) << ":" << __FUNCTION__ << "]" \<< endl \<< " ", \dump_func(__VA_ARGS__)#else#define DEB if (false)#define dump(...)#endiftemplate< typename T >struct ruiseki{vector <T> s;int sz;ruiseki(vector <T> &a){sz = a.size()+1;s.resize(sz);for(int i=1;i<sz;i++) s[i] = s[i-1] + a[i-1];}T get(int a, int b){if(a < 0) a = 0; if(a > sz-1) a = sz-1;if(b > sz-1) b = sz-1;return s[b] - s[a];}};vector <vector<int>> dp(3200,vector <int>(3200, -INF));signed main(void) { cin.tie(0); ios::sync_with_stdio(false);int n, m, k; cin>>n>>k>>m;vector <int> a(n);cin>>a;ruiseki <int> rui(a);dp[0][0] = 0;vector <deque <P>> deq1(k+1), deq2(k+1);deq1[0].pb({0, 0}), deq2[0].pb({0, 0});for(int i=0;i<n;i++){for(int j=1;j<=k;j++){while(1){if(deq1[j-1].empty()) break;else if(deq1[j-1].front().F < i + 1 - m) deq1[j-1].pop_front();else break;}while(1){if(deq2[j-1].empty()) break;else if(deq2[j-1].front().F < i + 1 - m) deq2[j-1].pop_front();else break;}int ma1 = -INF, ma2 = -INF;if(!deq1[j-1].empty()) ma1 = deq1[j-1].front().S;if(!deq2[j-1].empty()) ma2 = deq2[j-1].front().S;chmax(dp[i+1][j], ma1 - rui.get(0, i+1));chmax(dp[i+1][j], ma2 + rui.get(0, i+1));}for (int j = 0; j <= k; j++) {while(1){if(deq1[j].empty()) break;else if(deq1[j].back().S < dp[i+1][j] + rui.get(0, i+1)) deq1[j].pop_back();else break;}while(1){if(deq2[j].empty()) break;else if(deq2[j].back().S < dp[i+1][j] - rui.get(0, i+1)) deq2[j].pop_back();else break;}deq1[j].push_back({i+1, dp[i+1][j] + rui.get(0, i+1)});deq2[j].push_back({i+1 , dp[i+1][j] - rui.get(0, i+1)});}}print(dp[n][k]);}