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; }
没有人不辛苦,只有人不喊疼