CF1358D The Best Vacation(二分)

根据贪心的思想,取月末比取月初好,所以答案肯定是连续几个月加上某个月的月末

那么其实就是某个月的某天到某个月的月底,因此我们可以枚举月底,二分一下满足条件且是最小的某个月,使得他们的之间的天数<=x

这可以用前缀和。之后更新答案即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+10;
ll s1[N];
ll s2[N];
ll a[N],b[N];
int main(){
    ll n,x;
    cin>>n>>x;
    int i;
    for(i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        s1[i]=s1[i-1]+a[i];
        s2[i]=s2[i-1]+(a[i]+1)*a[i]/2;
    }
    for(i=n+1;i<=2*n;i++){
        s1[i]=s1[i-1]+a[i-n];
        s2[i]=s2[i-1]+(a[i-n]+1)*a[i-n]/2;
    }
    ll res=-1e18;
    for(i=1;i<=2*n;i++){
        if(s1[i]<x)
            continue;
        int pos=lower_bound(s1+1,s1+1+2*n,s1[i]-x)-s1;
        ll tmp=s2[i]-s2[pos];
        ll sign=x-s1[i]+s1[pos];
        tmp+=(a[pos]-sign+1+a[pos])*sign/2;
        res=max(tmp,res);
    }
    cout<<res<<endl;
}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/13083007.html