「长乐集训 2017 Day10」划分序列 (二分 dp)
「长乐集训 2017 Day10」划分序列
题目描述
给定一个长度为 n nn 的序列 Ai A_iAi,现在要求把这个序列分成恰好 K KK 段,(每一段是一个连续子序列,且每个元素恰好属于一段),并且每段至少有一个元素,使得和最大的那一段最小。
请你求出这个最小值。
输入格式
第一行两个整数 n,K n, Kn,K,意义见题目描述。
接下来一行 n nn 个整数表示序列 Ai A_iAi。
输出格式
仅一行一个整数表示答案。
样例
样例输入
9 4
1 1 1 3 2 2 1 3 1
样例输出
5
数据范围与提示
20% 20 \%20% 的数据,n≤100 n \leq 100n≤100
另有 20% 20 \%20% 的数据,Ai≥0 A_i \geq 0Ai≥0
另有 20% 20 \%20% 的数据,Ai≤0 A_i \leq 0Ai≤0
另有 20% 20 \%20% 的数据,K≤10 K \leq 10K≤10
100% 100 \%100% 的数据,1≤K≤n≤5×104,∣Ai∣≤3×104 1 \leq K \leq n \leq 5 \times 10 ^ 4, |A_i| \leq 3 \times 10 ^ 41≤K≤n≤5×104,∣Ai∣≤3×104
【题意】给一个序列 有正有负 要求恰好分成k份,使得和最大的那一份最小。
【分析】考虑二分答案,然后对于这个答案判断他的可行性。如果一段序列最大的那份小于等于x,且最少可分为 L 份,最多可分为 R 份,
则他一定能分为res份,L<=res<=R,那我们dp求L,R,对于序列中某一段可表示为,sum[i]-sum[j]<=mid,sum[j]>=sum[i]-mid,那么dp[i]可由
dp[j]得到,j<i且sum[j]>=sum[i]-mid,那么我们可以树状数组维护最小/最大值。
- #include <bits/stdc++.h>
- #define inf 0x3f3f3f3f
- #define met(a,b) memset(a,b,sizeof a)
- #define pb push_back
- #define mp make_pair
- #define rep(i,l,r) for(int i=(l);i<=(r);++i)
- #define inf 0x3f3f3f3f
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- const int N = 5e4+;;
- const int M = ;
- const int mod = ;
- const int mo=;
- const double pi= acos(-1.0);
- typedef pair<int,int>pii;
- typedef pair<ll,int>P;
- int n,k,sz;
- int a[N],mn[N],mx[N];
- int sum[N],pos[N],p[N];
- vector<pii>vec;
- void updmn(int x,int v)
- {
- for(;x;x-=x&-x)
- mn[x]=min(mn[x],v);
- }
- int getmn(int x)
- {
- int sum=inf;
- for(;x<=n;x+=x&-x)
- sum=min(sum,mn[x]);
- return sum;
- }
- void updmx(int x,int v)
- {
- for(;x;x-=x&-x)
- mx[x]=max(mx[x],v);
- }
- int getmx(int x)
- {
- int sum=-inf;
- for(;x<=n;x+=x&-x)
- sum=max(sum,mx[x]);
- return sum;
- }
- bool check(ll x){
- for(int i=,j=;i<vec.size();i++){
- while(j<vec.size()&&vec[j].first<vec[i].first-x)j++;
- pos[vec[i].second]=j+;
- }
- for(int i=;i<N;i++)mn[i]=inf,mx[i]=-inf;
- int l,r;
- ll res=;
- for(int i=;i<=n;i++){
- res+=a[i];
- int maxn=getmx(pos[i]);
- int minn=getmn(pos[i]);
- if(maxn!=-inf)maxn++;
- else {
- if(res<=x)maxn=;
- }
- if(minn!=inf)minn++;
- if(res<=x)minn=;
- updmn(p[i],minn);
- updmx(p[i],maxn);
- l=minn;r=maxn;
- }
- return l<=k&&k<=r;
- }
- int main(){
- scanf("%d%d",&n,&k);
- for(int i=;i<=n;i++){
- scanf("%d",&a[i]);
- sum[i]=sum[i-]+a[i];
- vec.pb(mp(sum[i],i));
- }
- sort(vec.begin(),vec.end());
- for(int i=;i<vec.size();i++)p[vec[i].second]=i+;
- ll l=-inf,r=inf,ans;
- while(l<=r){
- ll mid=(l+r)/;
- if(check(mid))ans=mid,r=mid-;
- else l=mid+;
- }
- printf("%lld\n",ans);
- return ;
- }
- /*
- 3 2
- -1 -2 3
- */
「长乐集训 2017 Day10」划分序列 (二分 dp)的更多相关文章
- loj6271 「长乐集训 2017 Day10」生成树求和 加强版(矩阵树定理,循环卷积)
loj6271 「长乐集训 2017 Day10」生成树求和 加强版(矩阵树定理,循环卷积) loj 题解时间 首先想到先分开三进制下每一位,然后每一位分别求结果为0,1,2的树的个数. 然后考虑矩阵 ...
- loj6271「长乐集训 2017 Day10」生成树求和 加强版
又是一个矩阵树套多项式的好题. 这里我们可以对每一位单独做矩阵树,但是矩阵树求的是边权积的和,而这里我们是要求加法,于是我们i将加法转化为多项式的乘法,其实这里相当于一个生成函数?之后如果我们暴力做的 ...
- LOJ#6271. 「长乐集训 2017 Day10」生成树求和 加强版
传送门 由于是边权三进制不进位的相加,那么可以考虑每一位的贡献 对于每一位,生成树的边权相当于是做模 \(3\) 意义下的加法 考虑最后每一种边权的生成树个数,这个可以直接用生成函数,在矩阵树求解的时 ...
- 「长乐集训 2017 Day1」区间 线段树
题目 对于两个区间\((a,b),(c,d)\),若\(c < a < d\)或\(c < b < d\)则可以从\((a,b)\)走到\((c,d)\)去,现在有以下两种操作 ...
- 「长乐集训 2017 Day8」修路 (斯坦纳树)
题目描述 村子间的小路年久失修,为了保障村子之间的往来,AAA君决定带领大家修路. 村子可以看做是一个边带权的无向图GGG, GGG 由 nnn 个点与 mmm 条边组成,图中的点从 1∼n1 \si ...
- 【LYOI 212】「雅礼集训 2017 Day8」价(二分匹配+最大权闭合子图)
「雅礼集训 2017 Day8」价 内存限制: 512 MiB时间限制: 1000 ms 输入文件: z.in输出文件: z.out [分析] 蛤?一开始看错题了,但是也没有改,因为不会做. 一开 ...
- 「6月雅礼集训 2017 Day10」quote
[题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...
- 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)
[题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...
- 「雅礼集训 2017 Day10」拍苍蝇
传送门 Description 有一天,小 A 的母亲对他家里的卫生状况非常不满意,他的房间里有非常多的苍蝇.在母亲的威逼利诱下,小 A 拿起了苍蝇拍去消灭家里的苍蝇.然而,小 A 以前从来没有亲手消 ...
随机推荐
- [整理]SQL Server Reporting Services Charts
http://msdn.microsoft.com/zh-cn/library/aa964128.aspx#mainSectionhttp://msdn.microsoft.com/en-us/lib ...
- 实验一 《网络对抗技术》逆向及Bof技术
- Anaconda+django写出第一个web app(五)
今天开始学习网页风格和设计,就像python有Web框架一样,也有一些CSS框架.对于CSS框架,我们可以使用默认的样式,也可以在原基础上编辑修改.本教程使用的是materialize这个CSS框架[ ...
- Python概念-Item系列(林海峰教的)
这个Item系列是egon老师自创的,个人还是可以接受这种文化底蕴的,所以直接拿来用,也是毫无违和感的 所谓Attr系列,其实是__setattr__,__delattr__,__getattr__ ...
- 查看GCC的内置宏定义
开发过程中我们常常需要使用宏定义.. 为了尽可能多的使用GCC为我们提供的特性,首先我们需要知道gcc提供了那些特性... gcc -dM -E - < /dev/null 没错,就这么一句话就 ...
- 使用RegSetValueEx修改注册表时遇到的问题(转)
原文转自 http://blog.csdn.net/tracyzhongcf/article/details/4076870 1.今天在使用RegSetValueEx时发现一个问题: RegSetVa ...
- 【内核】几个重要的linux内核文件【转】
转自:http://www.cnblogs.com/lcw/p/3159394.html Preface 当用户编译一个linux内核代码后,会产生几个文件:vmlinz.initrd.img, 以及 ...
- Mysql转换成SqlServer数据库,以及SqlServer转换成Mysql数据库
Windows XP sp2 MS SQL Server 2OOO sp1 MySql 5.0.41 1:MSSQLServer数据库导入到MySql数据库 步骤: 1.安装mysql数据库的ODBC ...
- Django Xadmin - 重构django admin
一.Django admin的执行流程 https://www.cnblogs.com/weihengblog/p/9122509.html 我的博客,介绍了django admin执行流程 二.Xa ...
- vue总结 03过滤器
过滤器 Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持).过滤器应该被添加在 JavaS ...