码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-05-29 09:29:55      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:res   getchar   二分图   out   const   ios   条件   define   line   

//存在一个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 二分+思维

标签:res   getchar   二分图   out   const   ios   条件   define   line   

原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12985097.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!