Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<queue>
- #include<deque>
- using namespace std;
- typedef long long int ll;
- ll const inf = 1e18;
- int const N = 1000010;
- int n;
- ll k;
- inline ll max(ll a,ll b){
- return (a > b ? a : b);
- }
- ll qs[N];
- ll arr[N];
- ll dp[N];
- int main()
- {
- scanf("%d %lld",&n,&k);
- for(int i = 1 ; i <= n ; i++){
- scanf("%lld",&arr[i]);
- qs[i] = qs[i-1] + arr[i];
- }
- dp[0] = 0;
- priority_queue<pair<ll,int> > pq;
- pq.push({0,0});
- deque<pair<ll,int> > dq;
- dq.push_back({0,0});
- //bottom up
- for(int i = 1 ; i <= n ; i ++){
- // while(!pq.empty() && pq.top().first - dp[pq.top().second - 1] + qs[i] > k)pq.pop();
- while(!dq.empty() && dq.front().first - dp[dq.front().second - 1] + qs[i] > k)dq.pop_front();
- // dp[i] = max(dp[i-1] ,pq.empty() ? 0 : pq.top().first + qs[i]);
- dp[i] = max(dp[i-1] , dq.empty() ? 0 : dq.front().first + qs[i]);
- // pq.push({dp[i-1]-qs[i],i});
- while(!dq.empty() && dq.back().first < dp[i-1]-qs[i])dq.pop_back();
- dq.push_back({dp[i-1]-qs[i],i});
- }
- printf("%lld",dp[n]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement