Submission #653981

#TimeUsernameProblemLanguageResultExecution timeMemory
653981pavementCigle (COI21_cigle)C++17
48 / 100
1089 ms60196 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; #ifdef _WIN32 #define getchar_unlocked _getchar_nolock #endif //~ #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, ans, t[10005], d[5005], p[5005], dp[5005][5005]; const int h = sizeof(int) * 8 - __builtin_clz(5000); void apply(int p, int value) { t[p] += value; if (p < N) d[p] += value; } void build(int p) { while (p > 1) p >>= 1, t[p] = max(t[p<<1], t[p<<1|1]) + d[p]; } void push(int p) { for (int s = h; s > 0; --s) { int i = p >> s; if (d[i] != 0) { apply(i<<1, d[i]); apply(i<<1|1, d[i]); d[i] = 0; } } } void inc(int l, int r, int value) { l += N, r += N; int l0 = l, r0 = r; for (; l < r; l >>= 1, r >>= 1) { if (l&1) apply(l++, value); if (r&1) apply(--r, value); } build(l0); build(r0 - 1); } int query(int l, int r) { l += N, r += N; push(l); push(r - 1); int res = -2e9; for (; l < r; l >>= 1, r >>= 1) { if (l&1) res = max(res, t[l++]); if (r&1) res = max(t[--r], res); } return res; } main() { ios::sync_with_stdio(0); cin.tie(0); cin >> N; for (int i = 1; i <= N; i++) { cin >> p[i]; p[i] += p[i - 1]; } for (int j = N; j >= 1; j--) { memset(t, 0, sizeof t); memset(d, 0, sizeof d); for (int k = j + 1; k <= N; k++) { inc(k - 1, k, dp[j + 1][k]); } int ptr = j + 1; for (int i = j; i >= 1; i--) { int ans = -1; while (ptr <= N && p[ptr] - p[j] < p[j] - p[i - 1]) ptr++; if (ptr <= N && p[ptr] - p[j] == p[j] - p[i - 1]) ans = ptr; dp[i][j] = query(0, N); assert(dp[i][j] >= dp[i + 1][j]); //~ cout << "DP " << i << ' ' << j << ' ' << root->val << '\n'; if (ans != -1) { inc(ans, N, 1); //~ cout << " + " << i << ' ' << ans << '\n'; } } } for (int i = 1; i <= N; i++) { ans = max(ans, dp[1][i]); } cout << ans << '\n'; }

Compilation message (stderr)

cigle.cpp:76:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   76 | 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...