Submission #1270435

#TimeUsernameProblemLanguageResultExecution timeMemory
1270435duyanhchupapiFeast (NOI19_feast)C++20
71 / 100
49 ms30792 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 300005; int n, k, a[N]; ll p[N], bit[N], dp[2002][2020]; void up(int id, ll val) { while(id <= n) bit[id] = max(bit[id], val), id += -id&id; } ll MAX(int id) { ll res = 0; while(id > 0) res = max(res, bit[id]), id -= -id&id; return res; } int main() { ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin >> n >> k; int mn = (int)2e9, dem = 0; for(int i=1;i<=n;++i) cin >> a[i], p[i] = p[i-1] + a[i], mn = min(mn, a[i]), dem += (a[i] < 0); if(mn >= 0) { cout << p[n]; return 0; } if(k == 1) { ll MIN = 0, ans = 0; for(int i=1;i<=n;++i) ans = max(ans, p[i] - MIN), MIN = min(MIN, p[i]); cout << ans;return 0; } if(dem == 1) { ll ans = 0; for(int i=1;i<=n;++i) ans += max(a[i], 0); cout << ans;return 0; } for(int j=1;j<=k;++j) { fill(bit,bit+n+1,0); for(int i=1;i<=n;++i) up(i,dp[i][j-1] - p[i]), dp[i][j] = max(dp[i-1][j], p[i] + MAX(i)); } cout << dp[n][k]; 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...