【CF-1358 D. The Best Vacation】 贪心
D. The Best Vacation
题意
某个地方,一年有\(n\)个月,第\(i\)月有\(a_i\)天,现在要选择一个长度为x的假期,
如果某天是某月的第\(i\)天,那么他的价值就是\(i\),求价值最大的假期。
题解
假期的最后一天一定是某个月的结尾,直接枚举。
PS:
我想的是假期的第一天或者最后一天一定是某个月的结尾,写的麻烦了。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
typedef unsigned long long ull;
ll arr[N*2],pre[N*2],val[N*2];
int main()
{
int n;
ll x;
scanf("%d%lld",&n,&x);
for(int i=1;i<=n;i++)
{
scanf("%lld",&arr[i]);
arr[i+n]=arr[i];
}
for(int i=1;i<=2*n;i++)
{
pre[i]=pre[i-1]+arr[i];
val[i]=val[i-1]+(arr[i]+1)*arr[i]/2;
}
ll ans=0;
for(int l=1,i=1+n;i<=2*n;i++)
{
while(pre[i]-pre[l]>x) l++;
ll now=val[i]-val[l];
ll rel=x-pre[i]+pre[l];
now+=(arr[l]+arr[l]-rel+1)*rel/2;
ans=max(ans,now);
}
printf("%lld\n",ans);
return 0;
}