虽然这是一个简单题,但是感觉好帅,想记录一下
C - Index × A(Continuous ver.) (atcoder.jp)
题意:
思路:
考虑往DS方向想:先考虑我们需要维护什么,然后再去考虑修改操作对需要维护的东西的影响,再去更新需要维护的东西
答案要求的是一个区间内1*ai+2*a(i+1)+....,所以我们考虑暴力维护这个区间的这个值
然后去考虑修改:往右移动一格窗口,贡献的变化如下:
所以我们需要维护变化的这个部分
其中波浪线部分直接可以维护区间和,然后左边少的那个和右边多的那个直接在移动窗口的时候维护就行
虽然是简单题,但是这就是DS的含金量!
Code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mxn=1e6+10;
const int mxe=1e6+10;
int n,m;
int a[mxn];
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
int in=0,sum=0;
int ans=-1e18;
for(int i=1;i<=m;i++){
in+=a[i];
sum+=i*a[i];
}
ans=max(ans,sum);
for(int i=m+1;i<=n;i++){
sum-=in;
in-=a[i-m+1-1];
in+=a[i];
sum+=a[i]*m;
ans=max(ans,sum);
}
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;//cin>>__;
while(__--)solve();return 0;
}