「长乐集训 2017 Day10」划分序列

题目描述

给定一个长度为 n nn 的序列 Ai A_iA​i​​,现在要求把这个序列分成恰好 K KK 段,(每一段是一个连续子序列,且每个元素恰好属于一段),并且每段至少有一个元素,使得和最大的那一段最小。

请你求出这个最小值。

输入格式

第一行两个整数 n,K n, Kn,K,意义见题目描述。
接下来一行 n nn 个整数表示序列 Ai A_iA​i​​。

输出格式

仅一行一个整数表示答案。

样例

样例输入

  1. 9 4
  2. 1 1 1 3 2 2 1 3 1

样例输出

  1. 5

数据范围与提示

20% 20 \%20% 的数据,n≤100 n \leq 100n≤100
另有 20% 20 \%20% 的数据,Ai≥0 A_i \geq 0A​i​​≥0
另有 20% 20 \%20% 的数据,Ai≤0 A_i \leq 0A​i​​≤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×10​4​​,∣A​i​​∣≤3×10​4​​

【题意】给一个序列  有正有负  要求恰好分成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,那么我们可以树状数组维护最小/最大值。

  1. #include <bits/stdc++.h>
  2. #define inf 0x3f3f3f3f
  3. #define met(a,b) memset(a,b,sizeof a)
  4. #define pb push_back
  5. #define mp make_pair
  6. #define rep(i,l,r) for(int i=(l);i<=(r);++i)
  7. #define inf 0x3f3f3f3f
  8. using namespace std;
  9. typedef long long ll;
  10. typedef unsigned long long ull;
  11. const int N = 5e4+;;
  12. const int M = ;
  13. const int mod = ;
  14. const int mo=;
  15. const double pi= acos(-1.0);
  16. typedef pair<int,int>pii;
  17. typedef pair<ll,int>P;
  18. int n,k,sz;
  19. int a[N],mn[N],mx[N];
  20. int sum[N],pos[N],p[N];
  21. vector<pii>vec;
  22. void updmn(int x,int v)
  23. {
  24. for(;x;x-=x&-x)
  25. mn[x]=min(mn[x],v);
  26. }
  27. int getmn(int x)
  28. {
  29. int sum=inf;
  30. for(;x<=n;x+=x&-x)
  31. sum=min(sum,mn[x]);
  32. return sum;
  33. }
  34. void updmx(int x,int v)
  35. {
  36. for(;x;x-=x&-x)
  37. mx[x]=max(mx[x],v);
  38. }
  39. int getmx(int x)
  40. {
  41. int sum=-inf;
  42. for(;x<=n;x+=x&-x)
  43. sum=max(sum,mx[x]);
  44. return sum;
  45. }
  46. bool check(ll x){
  47. for(int i=,j=;i<vec.size();i++){
  48. while(j<vec.size()&&vec[j].first<vec[i].first-x)j++;
  49. pos[vec[i].second]=j+;
  50. }
  51. for(int i=;i<N;i++)mn[i]=inf,mx[i]=-inf;
  52. int l,r;
  53. ll res=;
  54. for(int i=;i<=n;i++){
  55. res+=a[i];
  56. int maxn=getmx(pos[i]);
  57. int minn=getmn(pos[i]);
  58. if(maxn!=-inf)maxn++;
  59. else {
  60. if(res<=x)maxn=;
  61. }
  62. if(minn!=inf)minn++;
  63. if(res<=x)minn=;
  64. updmn(p[i],minn);
  65. updmx(p[i],maxn);
  66. l=minn;r=maxn;
  67. }
  68. return l<=k&&k<=r;
  69.  
  70. }
  71. int main(){
  72. scanf("%d%d",&n,&k);
  73. for(int i=;i<=n;i++){
  74. scanf("%d",&a[i]);
  75. sum[i]=sum[i-]+a[i];
  76. vec.pb(mp(sum[i],i));
  77. }
  78. sort(vec.begin(),vec.end());
  79. for(int i=;i<vec.size();i++)p[vec[i].second]=i+;
  80. ll l=-inf,r=inf,ans;
  81. while(l<=r){
  82. ll mid=(l+r)/;
  83. if(check(mid))ans=mid,r=mid-;
  84. else l=mid+;
  85. }
  86. printf("%lld\n",ans);
  87. return ;
  88. }
  89. /*
  90. 3 2
  91. -1 -2 3
  92. */

「长乐集训 2017 Day10」划分序列 (二分 dp)的更多相关文章

  1. loj6271 「长乐集训 2017 Day10」生成树求和 加强版(矩阵树定理,循环卷积)

    loj6271 「长乐集训 2017 Day10」生成树求和 加强版(矩阵树定理,循环卷积) loj 题解时间 首先想到先分开三进制下每一位,然后每一位分别求结果为0,1,2的树的个数. 然后考虑矩阵 ...

  2. loj6271「长乐集训 2017 Day10」生成树求和 加强版

    又是一个矩阵树套多项式的好题. 这里我们可以对每一位单独做矩阵树,但是矩阵树求的是边权积的和,而这里我们是要求加法,于是我们i将加法转化为多项式的乘法,其实这里相当于一个生成函数?之后如果我们暴力做的 ...

  3. LOJ#6271. 「长乐集训 2017 Day10」生成树求和 加强版

    传送门 由于是边权三进制不进位的相加,那么可以考虑每一位的贡献 对于每一位,生成树的边权相当于是做模 \(3\) 意义下的加法 考虑最后每一种边权的生成树个数,这个可以直接用生成函数,在矩阵树求解的时 ...

  4. 「长乐集训 2017 Day1」区间 线段树

    题目 对于两个区间\((a,b),(c,d)\),若\(c < a < d\)或\(c < b < d\)则可以从\((a,b)\)走到\((c,d)\)去,现在有以下两种操作 ...

  5. 「长乐集训 2017 Day8」修路 (斯坦纳树)

    题目描述 村子间的小路年久失修,为了保障村子之间的往来,AAA君决定带领大家修路. 村子可以看做是一个边带权的无向图GGG, GGG 由 nnn 个点与 mmm 条边组成,图中的点从 1∼n1 \si ...

  6. 【LYOI 212】「雅礼集训 2017 Day8」价(二分匹配+最大权闭合子图)

    「雅礼集训 2017 Day8」价 内存限制: 512 MiB时间限制: 1000 ms 输入文件: z.in输出文件: z.out   [分析] 蛤?一开始看错题了,但是也没有改,因为不会做. 一开 ...

  7. 「6月雅礼集训 2017 Day10」quote

    [题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...

  8. 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)

    [题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...

  9. 「雅礼集训 2017 Day10」拍苍蝇

    传送门 Description 有一天,小 A 的母亲对他家里的卫生状况非常不满意,他的房间里有非常多的苍蝇.在母亲的威逼利诱下,小 A 拿起了苍蝇拍去消灭家里的苍蝇.然而,小 A 以前从来没有亲手消 ...

随机推荐

  1. [整理]SQL Server Reporting Services Charts

    http://msdn.microsoft.com/zh-cn/library/aa964128.aspx#mainSectionhttp://msdn.microsoft.com/en-us/lib ...

  2. 实验一 《网络对抗技术》逆向及Bof技术

  3. Anaconda+django写出第一个web app(五)

    今天开始学习网页风格和设计,就像python有Web框架一样,也有一些CSS框架.对于CSS框架,我们可以使用默认的样式,也可以在原基础上编辑修改.本教程使用的是materialize这个CSS框架[ ...

  4. Python概念-Item系列(林海峰教的)

    这个Item系列是egon老师自创的,个人还是可以接受这种文化底蕴的,所以直接拿来用,也是毫无违和感的 所谓Attr系列,其实是__setattr__,__delattr__,__getattr__ ...

  5. 查看GCC的内置宏定义

    开发过程中我们常常需要使用宏定义.. 为了尽可能多的使用GCC为我们提供的特性,首先我们需要知道gcc提供了那些特性... gcc -dM -E - < /dev/null 没错,就这么一句话就 ...

  6. 使用RegSetValueEx修改注册表时遇到的问题(转)

    原文转自 http://blog.csdn.net/tracyzhongcf/article/details/4076870 1.今天在使用RegSetValueEx时发现一个问题: RegSetVa ...

  7. 【内核】几个重要的linux内核文件【转】

    转自:http://www.cnblogs.com/lcw/p/3159394.html Preface 当用户编译一个linux内核代码后,会产生几个文件:vmlinz.initrd.img, 以及 ...

  8. Mysql转换成SqlServer数据库,以及SqlServer转换成Mysql数据库

    Windows XP sp2 MS SQL Server 2OOO sp1 MySql 5.0.41 1:MSSQLServer数据库导入到MySql数据库 步骤: 1.安装mysql数据库的ODBC ...

  9. Django Xadmin - 重构django admin

    一.Django admin的执行流程 https://www.cnblogs.com/weihengblog/p/9122509.html 我的博客,介绍了django admin执行流程 二.Xa ...

  10. vue总结 03过滤器

    过滤器 Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持).过滤器应该被添加在 JavaS ...