Submission #342710

#TimeUsernameProblemLanguageResultExecution timeMemory
342710maskoffK blocks (IZhO14_blocks)C++17
53 / 100
1084 ms2988 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; int ans; int mx; int dp; } t[N * 4]; int a[N], l[N], n, k; int 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 build(int u, int l, int r) { t[u].tag = -1, 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; build(u + u, l, m); build(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); } int get(int u, int ul, int ur, int l, int r) { push(u, ul, ur); if (l > ur || ul > r) return 1e9; 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]; int 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); } build(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); } build(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:60:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   60 |   int um = ul + ur >> 1;
      |            ~~~^~~~
blocks.cpp: In function 'void build(int, int, int)':
blocks.cpp:73:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   73 |   int m = l + r >> 1;
      |           ~~^~~
blocks.cpp: In function 'int get(int, int, int, int, int)':
blocks.cpp:84:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   84 |   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...