Submission #1002881

#TimeUsernameProblemLanguageResultExecution timeMemory
1002881LalicCigle (COI21_cigle)C++17
48 / 100
1060 ms303824 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define all(x) x.begin(), x.end() #define allr(x) x.rbegin(), x.rend() #define mp make_pair #define int long long typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef complex<double> cd; const int MAXN = 5e3+10; const int MOD = 1e9+7; const int INF = 0x3f3f3f3f; const ll LINF = 0x3f3f3f3f3f3f3f3f; const double PI = acos(-1); //~ int dp[505][505][505]; //~ void solve(){ //~ int n; cin >> n; //~ vector<int> arr(n+1); arr[0]=0; //~ for(int i=1;i<=n;i++) cin >> arr[i]; //~ for(int i=3;i<=n;i++){ //~ int sum=arr[i]; //~ for(int c1=i-1;c1>=0;c1--){ //~ int tot=arr[c1], best=0; //~ bool ok=0; //~ for(int c2=c1-1;c2>=0;c2--){ //~ if(ok && tot>sum) dp[i][c1][c2]=dp[i-1][c1][c2]+1; //~ else{ //~ if(tot==sum) ok=1; //~ dp[i][c1][c2]=dp[i-1][c1][c2]; //~ } //~ tot+=arr[c2]; //~ best=max(best, dp[i-1][c1][c2]); //~ } //~ sum+=arr[c1]; //~ dp[i][i][c1]=best; //~ } //~ } //~ int ans=0; //~ for(int i=0;i<n;i++) ans=max(ans, dp[n][n][i]); //~ cout << ans << "\n"; //~ } int tree[MAXN][4*MAXN], lazy[MAXN][4*MAXN]; void lazyP(int id, int node, int l, int r){ if(!lazy[id][node]) return; tree[id][node]+=lazy[id][node]; if(l!=r){ lazy[id][node*2]+=lazy[id][node]; lazy[id][node*2+1]+=lazy[id][node]; } lazy[id][node]=0; } void upd(int id, int node, int l, int r, int p, int q, int val){ lazyP(id, node, l, r); if(r<p || l>q) return; if(l>=p && r<=q){ lazy[id][node]+=val; lazyP(id, node, l, r); return; } int mid=(l+r)>>1; upd(id, node*2, l, mid, p, q, val); upd(id, node*2+1, mid+1, r, p, q, val); tree[id][node]=max(tree[id][node*2], tree[id][node*2+1]); } int query(int id, int node, int l, int r, int p, int q){ lazyP(id, node, l, r); if(r<p || l>q) return 0; if(l>=p && r<=q) return tree[id][node]; int mid=(l+r)>>1; return max(query(id, node*2, l, mid, p, q), query(id, node*2+1, mid+1, r, p, q)); } void solve(){ int n; cin >> n; vector<int> arr(n+1); for(int i=1;i<=n;i++) cin >> arr[i]; for(int i=3;i<=n;i++){ int sum=arr[i], c2=i-2, tot=arr[i-1]; for(int c1=i-1;c1>=0;c1--){ upd(i, 1, 0, n, c1, c1, query(c1, 1, 0, n, 0, n)); while(c2>0 && tot<sum){ tot+=arr[c2]; c2--; } if(tot==sum && c2>0){ upd(c1, 1, 0, n, 0, c2-1, 1); //~ cout << i << " " << c1 << " " << c2 << "\n"; //~ for(int j=0;j<=c2-1;j++) cout << query(c1, 1, 0, n, j, j) << "\n"; } sum+=arr[c1]; tot-=arr[c1]; } } cout << query(n, 1, 0, n, 0, n) << "\n"; } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int tt=1; //~ cin >> tt; while(tt--) solve(); 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...