


解析:
可以观察到每次看电影所减少的舒畅值都和前一次有关,这样的话,可以发现减少的 d 只和最后一次看电影的时间有关。
所以枚举最后一次看电影的时间,并且维护一个优先队列,维护长度最长为m的数,如果大于m则不断弹出最小的数。
每次更新最大值。
- #include
- using namespace std;
- #define int long long
- const int N=2e5+5;
- int t,n,m,d,a[N];
- signed main(){
- scanf("%lld",&t);
- while(t--){
- scanf("%lld%lld%lld",&n,&m,&d);
- int sum=0,res=0;
- priority_queue<int,vector<int>,greater<int>>q;
- for(int i=1;i<=n;i++){
- scanf("%lld",&a[i]);
- if(a[i]>0){
- sum+=a[i];
- q.push(a[i]);
- while(q.size()>m){
- auto p=q.top();
- q.pop();
- sum-=p;
- }
- if(sum-i*d>res) res=sum-i*d;
- }
- }
- printf("%lld\n\n",res);
- }
- return 0;
- }