제출 #863507

#제출 시각아이디문제언어결과실행 시간메모리
863507letterc67Bigger segments (IZhO19_segments)C++14
13 / 100
1 ms4560 KiB
#include <bits/stdc++.h>
using namespace std;

#define pi pair<int, int>
#define inf32 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
#define all(x) x.begin(), x.end()
#define Unique(v) v.erase(unique(all(v)), v.end())
#define int long long
#define setinf(d) memset(d, inf32, sizeof d)
#define setneg(d) memset(d, -1, sizeof d)
#define set0(d) memset(d, 0, sizeof d)
#define Log2(x) 63 - __builtin_clzll(x)
#define oo 2e18
#define mod 1000000007
#define FILENAME "f"

const int maxn = 5e5 + 5;

int n;
int a[maxn], dp[maxn], last[maxn];

signed main(){
    // freopen( FILENAME".inp", "r", stdin);
    // freopen( FILENAME".out", "w", stdout);
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];

    //reverse(a + 1, a + n + 1);

    for(int i = 1; i <= n; i++) a[i] += a[i - 1];

    for(int i = 1; i <= n; i++){
        dp[i] = 1;
        int l = 1, r = i - 1, p = -1;
        while(l <= r){
            int m = (l + r) >> 1;
            if(a[m] + last[m] <= a[i]){
                p = m;
                l = m + 1;
            }else r = m - 1;
        }
      // cout << p << endl;
        if(p != -1){
            dp[i] = dp[p] + 1;
            last[i] = a[i] - a[p];
        }else{
            last[i] = a[i];
        }
  //  cout << i << ' ' << p << ' ' << last[i] << endl   ;
    }

  //  cout << dp[2];

    cout << dp[n];
}
#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...