Submission #705416

#TimeUsernameProblemLanguageResultExecution timeMemory
705416pavementBigger segments (IZhO19_segments)C++17
13 / 100
182 ms262144 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; //~ #define int long long #define mp make_pair #define mt make_tuple #define pb push_back #define ppb pop_back #define eb emplace_back #define g0(a) get<0>(a) #define g1(a) get<1>(a) #define g2(a) get<2>(a) #define g3(a) get<3>(a) mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); using db = double; using ll = long long; using ld = long double; using ii = pair<int, int>; using iii = tuple<int, int, int>; using iiii = tuple<int, int, int, int>; template<class key, class value = null_type, class cmp = less<key> > using ordered_set = tree<key, value, cmp, rb_tree_tag, tree_order_statistics_node_update>; int n, a[500005]; ll p[500005]; pair<int, ll> dp[500005]; struct node { node *left, *right; ll S, E; pair<int, ll> val; node(ll _s, ll _e) : left(nullptr), right(nullptr), S(_s), E(_e), val(-(ll)1e16, -(ll)1e16) {} void upd(ll p, pair<int, ll> v) { val = max(val, v); if (S == E) return; int M = (S + E) / 2; if (p <= M) { if (left == nullptr) left = new node(S, M); left->upd(p, v); } else { if (right == nullptr) right = new node(M + 1, E); right->upd(p, v); } } pair<int, ll> qry(ll p) { if (p < S) return mp(-1, -(ll)1e16); if (E <= p) return val; return max(left == nullptr ? mp(-1, -(ll)1e16) : left->qry(p), right == nullptr ? mp(-1, -(ll)1e16) : right->qry(p)); } } *root; main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n; root = new node(-(ll)1e16, (ll)1e16); for (int i = 1; i <= n; i++) { cin >> a[i]; p[i] = a[i] + p[i - 1]; assert(-(ll)1e16 <= p[i] && p[i] <= (ll)1e16); auto tmp = root->qry(p[i]); tmp.second -= p[i]; dp[i] = max(mp(1, -p[i]), tmp); assert(-(ll)1e16 <= p[i] - dp[i].second && p[i] - dp[i].second <= (ll)1e16); root->upd(p[i] - dp[i].second, mp(dp[i].first + 1, p[i])); } cout << dp[n].first << '\n'; }

Compilation message (stderr)

segments.cpp:54:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   54 | main() {
      | ^~~~
#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...