Submission #417362

#TimeUsernameProblemLanguageResultExecution timeMemory
417362dooweyCigle (COI21_cigle)C++14
48 / 100
1095 ms40988 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; #define fi first #define se second #define mp make_pair #define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); const int N = 5010; int dp[N][N]; int D[N]; struct Node{ int val; int lzy; }; Node T[N * 4 + 16]; void push(int node, int cl, int cr){ T[node].val += T[node].lzy; if(cl != cr){ T[node * 2].lzy += T[node].lzy; T[node * 2 + 1].lzy += T[node].lzy; } T[node].lzy = 0; } void update(int node, int cl, int cr, int tl, int tr, int v){ push(node, cl, cr); if(cr < tl || cl > tr) return; if(cl >= tl && cr <= tr){ T[node].lzy = v; push(node, cl, cr); return; } int mid = (cl + cr) / 2; update(node * 2, cl, mid, tl, tr, v); update(node * 2 + 1, mid + 1, cr, tl, tr, v); T[node].val = max(T[node * 2].val, T[node * 2 + 1].val); } void build(int node, int cl, int cr){ T[node].val = 0; T[node].lzy = 0; if(cl == cr) return ; int mid = (cl + cr) / 2; build(node * 2, cl, mid); build(node * 2 + 1, mid + 1, cr); } int main(){ fastIO; //freopen("in.txt","r",stdin); int n; cin >> n; for(int i = 1; i <= n; i ++ ){ cin >> D[i]; } int pp; int cum; int cur; int outp = 0; for(int cut = 2; cut <= n; cut ++ ){ build(1, 1, n ); for(int j = cut - 1; j >= 1; j -- ){ update(1, 1, n, j, j, dp[j][cut - 1]); } cur = 0; cum = 0; pp = cut; for(int go = cut; go <= n; go ++ ){ dp[cut][go] = T[1].val; if(go == n) outp = max(outp, dp[cut][go]); cur += D[go]; while(pp > 1 && cum < cur){ pp --; cum += D[pp]; } if(cum == cur){ update(1, 1, n, 1, pp - 1, +1); } } } cout << outp << "\n"; 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...