Submission #501660

#TimeUsernameProblemLanguageResultExecution timeMemory
501660LucaIlieBigger segments (IZhO19_segments)C++17
100 / 100
228 ms18844 KiB
#include <iostream> using namespace std; #define MAX_N 1000000 struct DP { int segm; long long suma; }; int v[MAX_N + 1]; long long sp[MAX_N + 1]; DP dp[MAX_N + 1]; int main() { int n, st, dr, mij, i, j; cin >> n; for ( i = 1; i <= n; i++ ) { cin >> v[i]; sp[i] = sp[i - 1] + v[i]; } dp[0] = { 1, 0 }; j = 1; for ( i = 1; i <= n; i++ ) { if ( dp[i - 1].segm > dp[i].segm ) dp[i] = { dp[i - 1].segm, dp[i - 1].suma + v[i] }; else if ( dp[i - 1].segm == dp[i].segm ) { if ( dp[i - 1].suma + v[i] < dp[i].suma ) dp[i].suma = dp[i - 1].suma + v[i]; } if ( i < n ) { st = i; dr = n; while ( dr - st > 1 ) { mij = (st + dr) / 2; if ( sp[mij] - sp[i] < dp[i].suma ) st = mij; else dr = mij; } j = dr; if ( sp[j] - sp[i] >= dp[i].suma ) { if ( dp[i].segm + 1 > dp[j].segm ) dp[j] = { dp[i].segm + 1, sp[j] - sp[i] }; else if ( dp[i].segm + 1 == dp[j].segm ) { if ( sp[j] - sp[i] < dp[j].suma ) dp[j].suma = sp[j] - sp[i]; } } } } cout << dp[n].segm; return 0; }
#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...