Submission #342653

#TimeUsernameProblemLanguageResultExecution timeMemory
342653maskoffK blocks (IZhO14_blocks)C++14
0 / 100
1 ms384 KiB
#include <bits/stdc++.h> #define file "" #define all(x) x.begin(), x.end() #define sc second #define fr first #define pb push_back #define mp make_pair using namespace std; typedef long long ll; typedef pair<int, int> pii; const ll inf = 1e18 + 5; const ll mod = 1e9 + 7; const int N = 1e6 + 5; int dx[] = {+1, 0, -1, 0}; int dy[] = {0, +1, 0, -1}; struct line { ll tag; ll ans; ll mx; } t[N]; ll a[N], l[N], n, k, dp[N]; void push(int u, int l, int r) { if (l == r || t[u].tag == -1) return; int m = l + r >> 1; t[u + u].ans -= t[u + u].mx; t[u + u + 1].ans -= t[u + u + 1].mx; t[u + u].mx = max(t[u].tag, t[u + u].mx); t[u + u + 1].mx = max(t[u].tag, t[u + u + 1].mx); t[u + u].ans += t[u + u].mx; t[u + u + 1].ans += t[u + u + 1].mx; t[u + u].tag = max(t[u + u].tag, t[u].tag); t[u + u + 1].tag = max(t[u + u + 1].tag, t[u].tag); return; } void update_mx(int u, int ul, int ur, int l, int r, ll val) { push(u, ul, ur); if (l > ur || ul > r) return; if (l <= ul && ur <= r) { t[u].ans -= t[u].mx; t[u].mx = max(t[u].mx, val); t[u].ans += t[u].mx; t[u].tag = max(t[u].tag, val); return; } int um = ul + ur >> 1; update_mx(u + u, ul, um, l, r, val); update_mx(u + u + 1, um + 1, ur, l, r, val); t[u].ans = min(t[u + u].ans, t[u + u + 1].ans); } void update(int u, int l, int r, int pos, ll val) { if (l == r) { t[u].ans = val; return; } int m = l + r >> 1; if (pos <= m) update(u + u, l, m, pos, val); else update (u + u + 1, m + 1, r, pos, val); t[u].ans = min(t[u + u].ans, t[u + u + 1].ans); } void clear(int u, int l, int r) { t[u].tag = -1, t[u].ans = 1e9, t[u].mx = 0; if (l == r) return; int m = l + r >> 1; clear(u * 2, l, m); clear(u * 2 + 1, m + 1, r); } int get(int u, int ul, int ur, int l, int r) { push(u, ul, ur); if (l > ur || ul > r) return 1e9 * 1ll; if (l <= ul && ur <= r) return t[u].ans; int um = ul + ur >> 1; return min(get(u + u, ul, um, l, r), get(u + u + 1, um + 1, ur, l, r)); } int main() { ios_base :: sync_with_stdio(false); cin.tie(nullptr); srand(time(nullptr)); cin >> n >> k; a[0] = 1e9; for (int i = 1; i <= n; i++) cin >> a[i]; ll mx = 0; for (int i = 1; i <= n; i++) mx = max(mx, a[i]), dp[i] = mx; stack<int> s; s.push(0); for (int i = 1; i <= n; i++) { while (a[s.top()] <= a[i]) s.pop(); l[i] = s.top() + 1; } clear(1, 1, n); for (int i = 1; i <= n; i++) update(1, 1, n, i, dp[i - 1]); for (int block = 2; block <= k; block++) { for (int i = block; i <= n; i++) { update_mx(1, 1, n, l[i], i, a[i]); dp[i] = get(1, 1, n, block, i); } clear(1, 1, n); for (int i = block; i <= n; i++) update(1, 1, n, i, dp[i - 1]); } cout << dp[n]; return 0; }

Compilation message (stderr)

blocks.cpp: In function 'void push(int, int, int)':
blocks.cpp:36:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   36 |   int m = l + r >> 1;
      |           ~~^~~
blocks.cpp:36:7: warning: unused variable 'm' [-Wunused-variable]
   36 |   int m = l + r >> 1;
      |       ^
blocks.cpp: In function 'void update_mx(int, int, int, int, int, ll)':
blocks.cpp:61:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   61 |   int um = ul + ur >> 1;
      |            ~~~^~~~
blocks.cpp: In function 'void update(int, int, int, int, ll)':
blocks.cpp:72:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   72 |  int m = l + r >> 1;
      |          ~~^~~
blocks.cpp: In function 'void clear(int, int, int)':
blocks.cpp:81:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   81 |   int m = l + r >> 1;
      |           ~~^~~
blocks.cpp: In function 'int get(int, int, int, int, int)':
blocks.cpp:90:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   90 |   int um = ul + ur >> 1;
      |            ~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...