PROBLEM LINK:
Setter: a0n0k0i0t
Tester: a0n0k0i0t
Editorialist: a0n0k0i0t
DIFFICULTY:
Easy - Medium
PREREQUISITES:
Window sliding, map
Explanation:
Observation:
- If you buy the i_{th} then you should buy the other candy with minimum cost in the window [i-R, i-L] for optimum solution
- You can maintain a dp array where dp[i] = max sweetness possible for candies from 1 to i if you buy the i_{th} candy
Base case dp[1] = A[i]
Progression rule dp[i] = A[i]+ max(\forall _{j \in [i-R,i-L]} dp[j])
Subtask 1:
Make an array of each window and find maximum of each window by traversal in O(N) and do this for all i (1 \leq i \leq N).
Time complexity:
O(N^2)
Subtask 2:
To find maximumm of each window maintain a map of dp values and at each pass remove the dp[i-R-1] from map and add dp[i-L] th cost to map. Maximum at each pass is the last element in map. This can be found in O(logN) for each i
Do this for all i (1 \leq i \leq N).
Find max of all values found.
Time complexity:
O(N*logN)
SOLUTION
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main() {
// your code goes here
ll T;
cin>>T;
while(T--){
ll n,l,r;
cin>>n>>l>>r;
vector<ll> a(n);
for(int i=0;i<n;i++)
cin>>a[i];
map<ll,ll> mp;
vector<ll> dp(n);
ll ans=0;
for(int i=0;i<n;i++){
if(i-r-1>=0){
mp[dp[i-r-1]]--;
if(mp[dp[i-r-1]]==0){
auto it =mp.find(dp[i-r-1]);
mp.erase(it);
}
}
if(i-l>=0){
mp[dp[i-l]]++;
}
ll temp=0;
if(mp.size()){
auto it =mp.end();
it--;
temp=it->first;
}
dp[i]=temp+a[i];
ans=max(ans,dp[i]);
}
cout<<ans<<"\n";
}
return 0;
}