二分答案$x$表示最大的一段的和。

设$f[i]$表示前$i$个最多分几段,满足最大的一段不超过$x$,若$f[n]\geq k$,则可行,

则$f[i]=\max(f[j])+1,sum[i]-sum[j]\leq x$。

用Treap优化DP,$O(n\log^2n)$。

同理再次二分得到最小的$x$,使得该限制下最少的段数$\leq k$。

则$ans=\max(x_0,x_1)$。

#include<cstdio>
#include<cstdlib>
const int N=20010,inf=1000000000;
int n,k,i,l,r,mid,ans0,ans1,f,sum[N];
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
struct node{
int p,val,vmx,vmi,mx,mi;node*l,*r;
node(){val=p=0,vmx=mx=-inf,vmi=mi=inf;l=r=NULL;}
inline void up(){
mx=max(vmx,max(l->mx,r->mx));
mi=min(vmi,min(l->mi,r->mi));
}
}*blank=new(node),pool[N],*cur=pool,*T;
inline void Rotatel(node*&x){node*y=x->r;x->r=y->l;x->up();y->l=x;y->up();x=y;}
inline void Rotater(node*&x){node*y=x->l;x->l=y->r;x->up();y->r=x;y->up();x=y;}
void Ins(node*&x,int p,int v){
if(x==blank){
x=cur++;x->val=p;x->l=x->r=blank;x->vmx=x->mx=x->vmi=x->mi=v;x->p=std::rand();
return;
}
x->mx=max(x->mx,v);
x->mi=min(x->mi,v);
if(p==x->val){
x->vmx=max(x->vmx,v);
x->vmi=min(x->vmi,v);
return;
}
if(p<x->val){
Ins(x->l,p,v);
if(x->l->p>x->p)Rotater(x);
}else{
Ins(x->r,p,v);
if(x->r->p>x->p)Rotatel(x);
}
}
int Askmx(node*&x,int p){
if(x==blank)return -inf;
if(p==x->val)return max(x->vmx,x->r->mx);
if(p<x->val)return max(x->vmx,max(x->r->mx,Askmx(x->l,p)));
return Askmx(x->r,p);
}
int Askmi(node*&x,int p){
if(x==blank)return inf;
if(p==x->val)return min(x->vmi,x->r->mi);
if(p<x->val)return min(x->vmi,min(x->r->mi,Askmi(x->l,p)));
return Askmi(x->r,p);
}
int main(){
blank->l=blank->r=blank;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)scanf("%d",&sum[i]),sum[i]+=sum[i-1];
l=-inf,r=ans0=ans1=inf;
while(l<=r){
mid=(l+r)>>1;
cur=pool,Ins(T=blank,0,0);
for(i=1;i<=n;i++)Ins(T,sum[i],f=Askmx(T,sum[i]-mid)+1);
if(f>=k)r=(ans0=mid)-1;else l=mid+1;
}
l=-inf,r=inf;
while(l<=r){
mid=(l+r)>>1;
cur=pool,Ins(T=blank,0,0);
for(i=1;i<=n;i++)Ins(T,sum[i],f=Askmi(T,sum[i]-mid)+1);
if(f<=k)r=(ans1=mid)-1;else l=mid+1;
}
return printf("%d",max(ans0,ans1)),0;
}

  

BZOJ2862 : 分糖果的更多相关文章

  1. CSDN 分糖果算法的思路和求助

    昨天晚上 在csdn上做了一道分糖果的题目,我自个测的是没有问题,但是提交答案后,老失败,提示 你的程序正常运行并输出了结果,但是答案错误你的程序输出结果与测试数据中的输出结果不符 我先把自个思路说一 ...

  2. hunnu11543:小明的烦恼——分糖果

    Problem description   小明在班里一直是个非常公正的孩子.这点同学和老师都非常清楚,这不,老师每周都会从家里带来一些糖果.然后叫小明把糖果分给其它小朋友,但这个班里的同学都有一个非 ...

  3. [LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现

    [LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现 原题: There are N children standing in a line. ...

  4. C语言 · 分糖果

    历届试题 分糖果   时间限制:1.0s   内存限制:256.0MB      问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一 ...

  5. 蓝桥杯 历届试题 PREV-32 分糖果

    历届试题 分糖果   时间限制:1.0s   内存限制:256.0MB 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半给左手边 ...

  6. 牛客 2018NOIP 模你赛2 T2 分糖果 解题报告

    分糖果 链接:https://www.nowcoder.com/acm/contest/173/B 来源:牛客网 题目描述 \(N\) 个小朋友围成一圈,你有无穷个糖果,想把其中一些分给他们. 从某个 ...

  7. 51nod——1402最大值、2479小b分糖果 (套路)

    1402最大值:正向从1到n,如果没有限制,就依次递增1,如果有限制,就取那个限制和递增到这的最小值.这样保证1和每个限制点后面都是符合题意的递增,但是限制点前面这个位置可能会有落差(之前递增多了). ...

  8. 58同城笔试题:数组去重;分饼干(分糖果);最小路径和(leetcode64)

    1. 数组去重 题目描述 /** * 有序数组去重 * 输出最终的数字个数 * 输入:1,2,2 * 输出:2 * @author Turing * */ 代码 import java.util.*; ...

  9. HNUSTOJ-1639 分糖果(几何)

    1639: 分糖果 时间限制: 1 Sec  内存限制: 128 MB提交: 261  解决: 118[提交][状态][讨论版] 题目描述 为了实验室的发展,吴大大采购了一箱零食O(∩_∩)O~~ 在 ...

随机推荐

  1. mac os 安装 pkg-config

    wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.29.tar.gz . env LDFLAGS="-framework ...

  2. Proc 和 代码块

    文章是从个人博客 搬过来的,大家也可以直接访问我的个人博客哦http://www.iwangzheng.com/ 如何将一段代码从对象中取出并将它像对象一样传递.在ruby中,一个Proc是一个包含一 ...

  3. django admin 扩展

    添加自定义动作: 例子,添加一个方法,批量更新文章,代码如下: from django.contrib import admin from myapp.models import Article de ...

  4. PHP日期格式转时间戳

    PHP 提供了函数可以方便的将各种形式的日期转换为时间戳,该类函数主要是: strtotime():将任何英文文本的日期时间描述解析为时间戳. mktime():从日期取得时间戳. strtotime ...

  5. TortoiseSVN中图标的含义

    今天在使用svn时发现有好多不认识了,所以查了下svn帮助手册.借此总结了下 svn 中图标的含义 一个新检出的工作复本使用绿色的勾做重载.表示Subversion状态 正常. 在开始编辑一个文件后, ...

  6. 【OpenStack】OpenStack系列2之KeyStone详解

    源码下载.依赖安装 参考:http://www.oschina.net/question/565065_66271 https://github.com/yongluo2013/osf-opensta ...

  7. 【Python】python代码如何调试?

    Python 程序如何高效地调试? 现在我在debug python程序就只是简单在有可能错误的地方print出来看一下,不知道python有没像c++的一些IDE一样有单步调试这类的工具?或者说各位 ...

  8. Nth to Last Node in List

    Find the nth to last element of a singly linked list. The minimum number of nodes in list is n. Exam ...

  9. CSS用类选择器在本页写样式

    <title>静夜思</title><style type="text/css">p{color:#ff0000; font-size:24px ...

  10. Sybase IQ如何将大文件数据迅速加载到数据库

    试想一下,如果一个文件5G.10G甚至更大.如何将它迅速地加载到数据库指定的表呢?我们看看Sybase IQ是如何迅速地将表的数据加载到数据库的. 数据文件格式: 1440,2011-01-09 00 ...