CF1358 D. The Best Vacation

CF1358 D. The Best Vacation

n n n个月,每个月有 a [ i ] a[i] a[i]天,每个月第 k k k天的贡献为 k k k,求连续 x x x天最大贡献为多少。

Solution

尺取
最后一个月一定会取完,只需要尺取枚举最后一个月即可,注意一下第一个月可能只取一部分。

  1. 尺取法可以用前缀和优化算贡献。
  2. 环可以用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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值