Codeforces Round #645 (Div. 2) D - The Best Vacation 二分+思维

Posted qingyuyyyyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #645 (Div. 2) D - The Best Vacation 二分+思维相关的知识,希望对你有一定的参考价值。

//存在一个k,i<j<k,且q[k]<q[i]<q[j]
//就不能放在一个栈内
//然后枚举一下所有的i j
//如果满足上面的条件,就连一条边
//然后判断是不是二分图
//左边是第一个栈,右边是第二个栈
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=4e5+10;
#define int long long
typedef long long ll;
inline ll read()
{
    ll x=0,w=1;
    char c=getchar();
    while(c<0||c>9)
    {
        if(c==-) w=-1;
        c=getchar();
    }
    while(c<=9&&c>=0)
    {
        x=(x<<1)+(x<<3)+c-0;
        c=getchar();
    }
    return w==1?x:-x;
}
ll n,k,a[N],pre[N],mx,t[N],pre2[N];
void solve()
{
    ll n=read();
    ll k=read();
    for(int i=1; i<=n ; i++) 
        a[i]=read(),a[n+i]=a[i];//破环成链 
    for(int i=1; i<=2*n; i++) 
        t[i]=a[i]*(a[i]+1)/2;//这个单位的价值 
    for(int i=1; i<=2*n ; i++) 
        //处理单个的价值     整个的价值 
        pre[i]=pre[i-1]+a[i],pre2[i]=pre2[i-1]+t[i];
    //枚举终点 
    for(int i=n+1; i<=2*n; i++)
    {
        int l=i-n,r=i+1;
        //二分查找起点 
        while(l<r)
        {
            int mid=(l+r)>>1;
            ll x=pre[i]-pre[mid-1];
            //说明天数不够 
            if(x<=k) 
                r=mid;
            else 
                l=mid+1;//天数太多了 
        }
        //直接选取的整块的            正与的天数 
        ll p=pre2[i]-pre2[l-1],p2=k-(pre[i]-pre[l-1]);
        ll res=a[l-1];
        p+=(res+res-p2+1)*p2/2;
        mx=max(mx,p);
    }
    cout<<mx<<endl;
}
signed main()
{
    int t=1;
    while(t--)
        solve();
}

 

以上是关于Codeforces Round #645 (Div. 2) D - The Best Vacation 二分+思维的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #645 (Div. 2)

Codeforces Round #645 (Div. 2)

Codeforces Round #645 (Div. 2) 题解 (ABCD) (E一定补!)

Codeforces Round #645 (Div. 2) 题解 (ABCD) (E一定补!)

Codeforces Round #645 (Div. 2) C - Celex Update 思维

Codeforces Round #645 (Div. 2) C - Celex Update 思维