Submission #685447

#TimeUsernameProblemLanguageResultExecution timeMemory
685447OrazBBigger segments (IZhO19_segments)C++14
100 / 100
93 ms38588 KiB
#include <bits/stdc++.h> #define N 500005 #define wr cout << "Continue debugging\n"; #define all(x) (x).begin(), (x).end() #define ll long long int #define pii pair <int, int> #define pb push_back #define ff first #define ss second using namespace std; ll a[N], mx, n, ind[N]; vector<int> vec; ll pref[N], dp[N][5]; int calc(int x){ int l = 0, r = vec.size()-1, pos = 0; while(l <= r){ int md = (l+r)/2; if (vec[md] > x) r = md - 1; else{ pos = vec[md]; l = md + 1; } } return pos; } int binary(int i, ll x){ int l = i+1, r = n, idx=i; while(l <= r){ int md = (l+r)/2; if (pref[md]-pref[i] >= x) r = md - 1; else{ idx = md; l = md + 1; } } return idx+1; } int main () { ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++){ cin >> a[i]; pref[i] = pref[i-1]+a[i]; } dp[1][1] = 1; dp[1][2] = a[1]; int pos = binary(1, a[1]); if (pos <= n){ ind[pos] = 1; vec.pb(pos); } for (int i = 2; i <= n; i++){ int pos = ind[calc(i)]; if (!pos){ dp[i][1] = 1; dp[i][2] = pref[i]; }else{ dp[i][1] = dp[pos][1]+1; dp[i][2] = pref[i]-pref[pos]; } pos = binary(i, dp[i][2]); if (pos > n) continue; ind[pos] = i; while(vec.size() and vec.back() >= pos){ vec.pop_back(); } vec.pb(pos); } cout << dp[n][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...
#Verdict Execution timeMemoryGrader output
Fetching results...