Submission #603314

#TimeUsernameProblemLanguageResultExecution timeMemory
603314OzyBigger segments (IZhO19_segments)C++17
0 / 100
1 ms340 KiB
#include <iostream> #include <bits/stdc++.h> using namespace std; #define lli long long int #define rep(i,a,b) for (int i = (a); i <= (b);i++) #define repa(i,a,b) for (int i = (a); i >= (b);i--) #define debug(a) cout << #a << " = " << a << endl #define debugsl(a) cout << #a << " = " << a << ", " #define MAX 3000 #define val first #define res second #define INF 1000000000000 lli n,a; lli prim[MAX+2],res[MAX+2],arr[MAX+2],acu[MAX+2]; pair<lli,lli> dp[MAX+2]; lli binaria(lli f, lli busco) { lli fin = f; lli ini = prim[busco-1]; lli a,b,mitad,last = -1; while (ini <= fin) { mitad = (ini+fin)/2; if (res[mitad] == busco) a = dp[mitad].second; else a = dp[mitad].first; b = acu[f] - acu[mitad]; if (a < b) { last = mitad; ini = mitad+1; } else fin = mitad-1; } return last; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n; rep(i,1,n) { cin >> arr[i]; acu[i] = arr[i] + acu[i-1]; } dp[1] = {arr[1],INF}; res[1] = 1; prim[1] = 1; //ciudado con el second 0 rep(i,2,n) { a = binaria(i,res[i-1]+1); if (a != -1) { res[i] = res[i-1]+1; prim[res[i]] = i; dp[i].first = acu[i]-acu[a]; a = binaria(i,res[i-1]); dp[i].second = acu[i] - acu[a]; } else { res[i] = res[i-1]; a = binaria(i,res[i-1]); dp[i].first = acu[i] - acu[a]; if (res[i-1]-1 == 0) dp[i].second = INF; else { a = binaria(i,res[i-1]-1); dp[i].second = acu[i] - acu[a]; } } //debugsl(i); //debugsl(res[i]); //debugsl(dp[i].first); //debug(dp[i].second); } cout << res[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...