/*
首先想到二分答案,难点在于如何判断是否有K段,每段和<=mid
把问题转化成求最多有R段,最少有L段,每段的的和<=mid,如果 L<=K<=R 那么显然存在把这个序列分成K段的策略
用dp_max[i]表示到i位最多可分成的段数,那么只要枚举下标为[1,i-1]里所有 pre[j]+mid<=pre[i]的 j , 找到最大的dp_max[j]再+1就是dp_max[i]
dp_min[i]同理,然后一旦找到 dp_min[i]<=K<=dp_max[i] 就是可行
可是n的范围是2e5,我们可以用线段树来优化找dp_max[j]的过程:因为找的是所有pre[j]>=pre[i]-mid的j,那直接用线段树维护代表pre[j]的dp_max[j]即可,然后就可以进行查询
要注意处理边界问题(pre[0]=0的情况)

*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
#define ll long long
#define INF 0x3f3f3f3f3f3f
ll m,k,n,a[maxn],pre[maxn],s[maxn]; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int Max[maxn<<];
void pushup(int rt){Max[rt]=max(Max[rt<<],Max[rt<<|]);}
void update(int pos,int val,int l,int r,int rt){
if(l==r){
Max[rt]=val;return;
}
int m=l+r>>;
if(pos<=m)update(pos,val,lson);
else update(pos,val,rson);
pushup(rt);
}
int query(int L,int R,int l,int r,int rt){
if(L<=l && R>=r){return Max[rt];}
int m=l+r>>,res=-0x3f3f3f3f;
if(L<=m)res=max(res,query(L,R,lson));
if(R>m)res=max(res,query(L,R,rson));
return res;
}
int zero;
int judge(ll mid){
memset(Max,-0x3f,sizeof Max);
update(zero,,,m,);
for(int i=;i<=n;i++){
int pos1=lower_bound(s+,s++m,pre[i]-mid)-s;
int pos2=lower_bound(s+,s++m,pre[i])-s;
if(pos1>m)continue;//越界了,不去线段树里查询
int tmp=query(pos1,m,,m,);//查询区间的最大值
tmp++;
if(tmp>=k)return ;
else update(pos2,tmp,,m,);
}
return ;
} int main(){
int t;cin>>t;
while(t--){
scanf("%lld%lld",&n,&k);
for(int i=;i<=n;i++){
scanf("%lld",&a[i]);
pre[i]=pre[i-]+a[i];
s[++m]=pre[i];
}
s[++m]=;
sort(s+,s++m);
m=unique(s+,s++m)-s-;
zero=lower_bound(s+,s++m,)-s; ll mid,ans,L=-INF,R=INF;
while(L<=R){
mid=L+R>>;
if(judge(mid))
ans=mid,R=mid-;
else L=mid+;
}
cout<<ans<<endl;
}
return ;
}

hdu6606多校第四次04——线段树加速dp的更多相关文章

  1. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

  2. 2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)

    小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Proble ...

  3. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  4. 2018.09.12 poj2376Cleaning Shifts(线段树+简单dp)

    传送门 貌似贪心能过啊%%%. 本蒟蒻写的线段树优化dp. 式子很好推啊. f[i]表示覆盖1~i所需的最小代价. 那么显然对于一个区间[li,ri]" role="present ...

  5. CF833B The Bakery 线段树,DP

    CF833B The Bakery LG传送门 线段树优化DP. 其实这是很久以前就应该做了的一道题,由于颓废一直咕在那里,其实还是挺不错的一道题. 先考虑\(O(n^2k)\)做法:设\(f[i][ ...

  6. Codeforces Round #426 (Div. 2) D 线段树优化dp

    D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  7. codeforces Good bye 2016 E 线段树维护dp区间合并

    codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...

  8. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

  9. Codeforces 834D The Bakery 【线段树优化DP】*

    Codeforces 834D The Bakery LINK 题目大意是给你一个长度为n的序列分成k段,每一段的贡献是这一段中不同的数的个数,求最大贡献 是第一次做线段树维护DP值的题 感觉还可以, ...

随机推荐

  1. PHP-删除排序数组中的重复项

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1 ...

  2. SQL优化(三)—— 索引、explain分析

    SQL优化(三)—— 索引.explain分析   一.什么是索引 索引是一种排好序的快速查找的数据结构,它帮助数据库高效的查询数据 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据 ...

  3. 在IntelliJ IDEA中新建Maven项目

    在IntelliJ IDEA中新建Maven项目,选择“File->New->Project”,创建一个简单项目,不选择模板,如下图所示: 2 选择“Maven”,不需要使用内置结构(模板 ...

  4. go声明和初始化

    go声明和初始化 当我们第一次看见变量和声明时,我们仅仅看见一些内置的类型,比如整型和字符串.现在我们将学习结构体,并且我们会深入学习包括指针的内容. 通过一种最简单的方式去创建一个结构体值类型: g ...

  5. RAM SSO功能重磅发布 —— 满足客户使用企业本地账号登录阿里云

    阿里云RAM (Resource Access Management)为客户提供身份与访问控制管理服务.使用RAM,可以轻松创建并管理您的用户(比如雇员.企业开发的应用程序),并控制用户对云资源的访问 ...

  6. xml配置离线约束的目的和ecplipse离线约束配置

    正常情况下如果电脑已经联网的情况下,Spring的核心配置文件编写内容的时候是可以自动提示的,假设电脑如果离线情况下想要自动提示的话,就得配置离线约束文件. https://blog.csdn.net ...

  7. 创建一个apk:按钮-click-文字display,测试apk;安装在真机进行调试的方法

    问题引入: 怎么样在一个app做event事件?例如touch操作,滑动操作,和按键事件(back,home等) 回答1:device.touch(x,y) ---获取device对象,然后touch ...

  8. js设计模式——3.观察者模式

    js设计模式——观察者模式 /*js设计模式——.观察者模式*/ // 主题,保存状态,状态变化之后触发所有观察者对象 class Subject { constructor() { this.sta ...

  9. (1)sqlserver2017安装

    本体 https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 图形管理工具ssm 文档 https://docs.microso ...

  10. jmter 二次开发 IDEA 项目5.1

    jmter 二次开发 IDEA 项目5.1 IDEA 编译 Jmeter 5.0(二次开发) 1. Java环境配置 1.1     步骤1 1.2     步骤2 1.3     步骤3 1.4   ...