Submission #342701

#TimeUsernameProblemLanguageResultExecution timeMemory
342701maskoffK blocks (IZhO14_blocks)C++17
53 / 100
1062 ms5740 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 = 1e5 + 5; int dx[] = {+1, 0, -1, 0}; int dy[] = {0, +1, 0, -1}; struct line { int tag; ll ans; int mx; ll dp; } t[N * 4]; 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; 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].dp; t[u + u + 1].ans = t[u + u + 1].mx + t[u + u + 1].dp; 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); t[u].tag = -1; } void update_mx(int u, int ul, int ur, int l, int r, int val) { push(u, ul, ur); if (l > ur || ul > r) return; if (l <= ul && ur <= r) { t[u].mx = max(t[u].mx, val); t[u].ans = t[u].mx + t[u].dp; 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, int val) { if (l == r) { t[u].ans = val; t[u].dp = 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); t[u].dp = min(t[u + u].dp, t[u + u + 1].dp); } void clear(int u, int l, int r) { t[u].tag = -1, t[u].ans = 1e18, t[u].mx = 0; if (l == r) { t[u].dp = dp[l - 1]; t[u].ans = dp[l - 1]; return; } int m = l + r >> 1; clear(u + u, l, m); clear(u + u + 1, m + 1, r); t[u].ans = min(t[u + u].ans, t[u + u + 1].ans); t[u].dp = min(t[u + u].dp, t[u + u + 1].dp); } ll get(int u, int ul, int ur, int l, int r) { push(u, ul, ur); if (l > ur || ul > r) return 1e18 * 1ll; if (l <= ul && ur <= r) return t[u].ans; int um = ul + ur >> 1ll; 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; s.push(i); } clear(1, 1, n); 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); } cout << dp[n]; return 0; }

Compilation message (stderr)

blocks.cpp: In function 'void update_mx(int, int, int, int, int, int)':
blocks.cpp:59:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   59 |   int um = ul + ur >> 1;
      |            ~~~^~~~
blocks.cpp: In function 'void update(int, int, int, int, int)':
blocks.cpp:71:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   71 |  int m = l + r >> 1;
      |          ~~^~~
blocks.cpp: In function 'void clear(int, int, int)':
blocks.cpp:85:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   85 |   int m = l + r >> 1;
      |           ~~^~~
blocks.cpp: In function 'll get(int, int, int, int, int)':
blocks.cpp:96:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   96 |   int um = ul + ur >> 1ll;
      |            ~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...