CF1358 D. The Best Vacation
個月,每個月有天,每個月第天的貢獻爲,求連續天最大貢獻爲多少。
Solution
尺取
最後一個月一定會取完,只需要尺取枚舉最後一個月即可,注意一下第一個月可能只取一部分。
- 尺取法可以用前綴和優化算貢獻。
- 環可以用2n的數組等效替代。
Code
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll N = 4e5 + 5;
ll a[N],b[N],c[N],n,x,ans;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>x;
for(int i=1;i<=n;i++) cin>>a[i],a[n+i]=a[i];
for(int i=1;i<=2*n;i++) b[i]=b[i-1]+a[i];
for(int i=1;i<=2*n;i++) c[i]=c[i-1]+(a[i]+1)*a[i]/2;
int L=0;
for(int R=n+1;R<=2*n;R++){
for(;b[R]-b[L]>x;++L);
ll rem=x-(b[R]-b[L]);
ll v=c[R]-c[L]+rem*(2*a[L]-rem+1)/2;
ans=max(ans,v);
}
cout<<ans;
return 0;
}