제출 #1141220

#제출 시각아이디문제언어결과실행 시간메모리
1141220NurislamBigger segments (IZhO19_segments)C++20
13 / 100
0 ms328 KiB
#include <bits/stdc++.h> using namespace std; signed main(){ int n; cin >> n; vector<int> a(n); for(int &i : a) cin >> i; vector<int> pr{0}; for(int i : a) pr.push_back(pr.back() + i); vector<int> dp (n + 1, 0), opt(n + 1, 0); for(int i = 1; i <= n; i++){ opt[i] = opt[i-1] + a[i-1]; dp[i] = dp[i-1]; if( a[i-1] >= opt[i-1] ) dp[i] = dp[i-1]+1, opt[i] = a[i-1]; //cout << dp[i] << ' ' << opt[i] << '\n'; int l = 0, r = i-1, ch = 0; while(l <= r){ int m = (l+r) >> 1; if( dp[m] < dp[i] ) l = m + 1; else if( opt[m] > pr[i] - pr[m] ) r = m - 1; else{ l = m + 1; ch = m; } } if( dp[i] < dp[ch] + 1){ dp[i] = dp[ch] + 1; opt[i] = pr[i] - pr[ch]; } l = 0; r = i-1; ch = 0; while(l <= r){ int m = (l+r) >> 1; if( dp[m]+1 < dp[i] ) l = m + 1; else if( opt[m] > pr[i] - pr[m] ) r = m - 1; else{ l = m + 1; ch = m; } } if( dp[i] == dp[ch] + 1) opt[i] = min( opt[i], pr[i] - pr[ch] ); } //for(int i = 0; i <= n; i++)cout << dp[i] << ' '; //cout << '\n'; //for(int i = 0; i <= n; i++)cout << opt[i] << ' '; //cout << '\n'; cout << dp[n] << '\n'; }; /* Wrong answer on test: 268 6 5 4 5 4 11 12 Correct: 3 Wrong: 2 */
#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...