Submission #716196

#TimeUsernameProblemLanguageResultExecution timeMemory
716196arush_aguSplit the sequence (APIO14_sequence)C++17
100 / 100
1525 ms83276 KiB
#include <algorithm> #include <cctype> #include <cmath> #include <cstdio> #include <cstring> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include <functional> #include <iomanip> #include <iostream> #include <iterator> #include <list> #include <map> #include <numeric> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <unordered_map> #include <unordered_set> #include <vector> #ifdef DEBUG #include <time.h> #endif #define all(a) (a).begin(), (a).end() #define rev(a) (a).rbegin(), (a).rend() #define F first #define S second int recur_depth = 0; #ifdef DEBUG #define dbg(x) \ { \ ++recur_depth; \ auto x_ = x; \ --recur_depth; \ cerr << string(recur_depth, '\t') << "\e[91m" << __func__ << ":" \ << __LINE__ << "\t" << #x << " = " << x_ << "\e[39m" << endl; \ } #else #define dbg(x) #endif using namespace std; using namespace __gnu_pbds; typedef pair<int, int> ii; typedef long long ll; typedef long double ld; typedef pair<ll, ll> llll; typedef vector<int> vi; typedef vector<vi> vvi; typedef vector<pair<int, int>> vii; typedef vector<vii> vvii; typedef vector<ll> vl; typedef vector<vl> vvl; typedef vector<pair<ll, ll>> vll; typedef vector<vll> vvll; typedef vector<bool> vb; template <class type1> using ordered_set = tree<type1, null_type, less<type1>, rb_tree_tag, tree_order_statistics_node_update>; template <typename A, typename B> ostream &operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; } template <typename T_container, typename T = typename enable_if< !is_same<T_container, string>::value, typename T_container::value_type>::type> ostream &operator<<(ostream &os, const T_container &v) { os << '{'; string sep; for (const T &x : v) os << sep << x, sep = ", "; return os << '}'; } const ll MOD = 1e9 + 7; // const ll MOD = 998244353; const ll INF = 2e18; const ld EPS = 1e-9; void solve() { int n, k; cin >> n >> k; vl a(n); for (ll &x : a) cin >> x; vl p(n); partial_sum(all(a), p.begin()); // cerr << p << "\n"; // vvl dp(k + 1, vl(n, -1)), split_at(k + 1, vl(n, -1)); // function<ll(int, int)> f = [&](int i, int no_sub) -> ll { // if (i < no_sub) return -INF; // if (no_sub == 0) return 0; // // ll &x = dp[no_sub][i]; // if (x != -1) return x; // // // cerr << i << " " << no_sub << "\n"; // // x = -INF; // for (int split=i - 1; split>=0; split--) { // ll split_score = f(split, no_sub - 1); // // cerr << "Split: " << split << "\n"; // // cerr << "\t" << split_score << "\n"; // // cerr << "\t" << p[split] * (p[i] - p[split]) << "\n"; // if (split_score >= 0) { // ll curr = p[split] * (p[i] - p[split]) + split_score; // if (x < curr) { // x = curr; // split_at[no_sub][i] = split; // } // } // } // // return x; // }; // // // cerr << f(2, 1) << "\n"; // // cout << f(n - 1, k) << "\n"; // int idx = n - 1; // vl sa; // for (int kk=k; kk>0; kk--) { // sa.push_back(split_at[kk][idx]); // idx = sa.back(); // } // reverse(all(sa)); // for (ll &x : sa) cout << x + 1 << " "; // cout << "\n"; vl dp_before(n), dp_after(n); vvi split_at(k + 1, vi(n)); function<void(int, int, int, int, int)> f = [&](int l, int r, int sl, int sr, int kk) { if (l > r) return; int mid = (l + r) / 2; llll best = {-INF, sl}; for (int ss=sl; ss<min(mid, sr + 1); ss++) if (dp_before[ss] >= 0) { ll curr_cost = p[ss] * (p[mid] - p[ss]) + dp_before[ss]; best = max(best, {curr_cost, ss}); } dp_after[mid] = best.first; split_at[kk][mid] = best.second; f(l, mid - 1, sl, best.second, kk); f(mid + 1, r, best.second, sr, kk); }; for (int i=1; i<=k; i++) { f(0, n - 1, 0, n - 1, i); swap(dp_before, dp_after); } cout << dp_before[n - 1] << "\n"; int idx = n - 1; vl sa; for (int kk=k; kk>0; kk--) { sa.push_back(split_at[kk][idx]); idx = sa.back(); } reverse(all(sa)); for (ll &x : sa) cout << x + 1 << " "; cout << "\n"; } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); clock_t start = clock(); int test_cases = 1; /* cin >> test_cases; */ while (test_cases--) solve(); #ifdef DEBUG cerr << fixed << setprecision(10) << "\nTime Taken: " << (double)(clock() - start) / CLOCKS_PER_SEC << "s\n"; #endif return 0; }

Compilation message (stderr)

sequence.cpp: In function 'int main()':
sequence.cpp:179:11: warning: unused variable 'start' [-Wunused-variable]
  179 |   clock_t start = clock();
      |           ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...