Submission #1319385

#TimeUsernameProblemLanguageResultExecution timeMemory
1319385JohanBigger segments (IZhO19_segments)C++20
37 / 100
1595 ms7564 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
const int N = 2e5 + 5;
int a[N], pr[N], cur[N], dp[N][2], n, best = 0;
array < int , 2 > st[N * 4];
array < int , 2 > merge(array < int , 2 > l, array < int , 2 > r){
  if(l[0] < r[0])return l;
  if(l[0] > r[0])return r;
  array < int , 2 > rs = l;
  if(l[1] < r[1])rs[1] = r[1];
  return rs; 
}
void upd(int v, int l, int r, int pos, int val){
  if(l == r){
    st[v] = {val, l};
    return;
  }
  int mid = (l + r) >> 1;
  if(mid >= pos)upd(v * 2, l, mid, pos, val);
  else upd(v * 2 + 1, mid + 1, r, pos, val);
  st[v] = merge(st[v * 2], st[v * 2 + 1]);
}
void ask(int v, int l, int r, int cur){
  if(st[v][0] <= cur)
    best = max(best, st[v][1]);
  if(l == r)return;
  int mid = (l + r) >> 1;
  if(st[v * 2][0] <= cur)ask(v * 2, l, mid, cur);
  if(st[v * 2 + 1][0] <= cur)ask(v * 2 + 1, mid + 1, r, cur);
}
signed main(){
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for(int i = 1; i <= n; i++){
    cin >> a[i];
    pr[i] = pr[i - 1] + a[i];
    dp[i][0] = -1;
    dp[i][1] = INF;
    upd(1, 1, n, i, INF);
  }
  dp[1][0] = 1;
  dp[1][1] = a[1];
  upd(1, 1, n, 1, a[1] + pr[1]);
  for(int i = 2; i <= n; i++){
    best = 0;
    ask(1, 0, n, pr[i]);
    dp[i][1] = min(dp[i][1], pr[i] - pr[best]);
    upd(1, 1, n, i, dp[i][1] + pr[i]);
    dp[i][0] = dp[best][0] + 1;
  }
  cout << dp[n][0] << endl;
}
#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...