题意:给定一个长为n的数组,要求挑它前缀的一段,将其分成k段,使得每段和的最大值最小

1<=k<=n<=2e5,abs(a[i])<=1e9

思路:

刚开始写了线段树TLE

改维护后缀的BIT也TLE

暴力sort改归并排序才卡过去

怀疑用map离散化不靠谱

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef unsigned int uint;
  5. typedef unsigned long long ull;
  6. typedef pair<int,int> PII;
  7. typedef pair<ll,ll> Pll;
  8. typedef vector<int> VI;
  9. typedef vector<PII> VII;
  10. typedef pair<ll,ll>P;
  11. #define N 400010
  12. #define M 200010
  13. #define fi first
  14. #define se second
  15. #define MP make_pair
  16. #define pi acos(-1)
  17. #define mem(a,b) memset(a,b,sizeof(a))
  18. #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
  19. #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
  20. #define lowbit(x) x&(-x)
  21. #define Rand (rand()*(1<<16)+rand())
  22. #define id(x) ((x)<=B?(x):m-n/(x)+1)
  23. #define ls p<<1
  24. #define rs p<<1|1
  25.  
  26. const ll MOD=1e9+,inv2=(MOD+)/;
  27. double eps=1e-;
  28. ll INF=1e10;
  29. ll inf=5e13;
  30. int dx[]={-,,,};
  31. int dy[]={,,-,};
  32.  
  33. map<ll,int> mp;
  34. int t[N],n,k,id;
  35. ll s[M],a[M],b[M],c[N];
  36.  
  37. int read()
  38. {
  39. int v=,f=;
  40. char c=getchar();
  41. while(c<||<c) {if(c=='-') f=-; c=getchar();}
  42. while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
  43. return v*f;
  44. }
  45.  
  46. void update(int x,int y)
  47. {
  48. while(x)
  49. {
  50. t[x]=max(t[x],y);
  51. x-=lowbit(x);
  52. }
  53. }
  54.  
  55. int query(int x)
  56. {
  57. int res=-2e6;
  58. while(x<=id)
  59. {
  60. res=max(res,t[x]);
  61. x+=lowbit(x);
  62. }
  63. return res;
  64. }
  65.  
  66. int isok(ll mid)
  67. {
  68. mp.clear();
  69. int m=;
  70. rep(i,,n+) b[i]=a[i]-mid;
  71. int i=,j=;
  72. while(i<=n+&&j<=n+)
  73. {
  74. m++;
  75. if(a[i]<b[j])
  76. {
  77. c[m]=a[i];
  78. i++;
  79. }
  80. else
  81. {
  82. c[m]=b[j];
  83. j++;
  84. }
  85. }
  86. while(i<=n+)
  87. {
  88. c[++m]=a[i];
  89. i++;
  90. }
  91. while(j<=n+)
  92. {
  93. c[++m]=b[j];
  94. j++;
  95. }
  96. id=;
  97. mp[c[]]=;
  98. rep(i,,m)
  99. if(c[i]!=c[i-]) mp[c[i]]=++id;
  100. rep(i,,id) t[i]=-2e6;
  101. update(mp[],);
  102. int ans=,flag=;
  103. rep(i,,n)
  104. {
  105. int tmp=query(mp[s[i]-mid]);
  106. ans=max(ans,tmp+);
  107. if(ans>=k) return ;
  108. update(mp[s[i]],tmp+);
  109. }
  110. return ;
  111. }
  112.  
  113. int main()
  114. {
  115. int cas=read();
  116. while(cas--)
  117. {
  118. n=read(),k=read();
  119. s[]=;
  120. rep(i,,n)
  121. {
  122. int x=read();
  123. s[i]=s[i-]+x;
  124. }
  125. rep(i,,n+) a[i]=s[i-];
  126. sort(a+,a+n++);
  127. ll l=-1e10,r=1e10,last=1e10;
  128. while(l<=r)
  129. {
  130. ll mid=(l+r)>>;
  131. if(isok(mid)){last=mid; r=mid-;}
  132. else l=mid+;
  133. }
  134. printf("%I64d\n",last);
  135. }
  136.  
  137. return ;
  138. }

【HDOJ6606】Distribution of books(二分,BIT)的更多相关文章

  1. 2019杭电多校第三场hdu6606 Distribution of books(二分答案+dp+权值线段树)

    Distribution of books 题目传送门 解题思路 求最大值的最小值,可以想到用二分答案. 对于二分出的每个mid,要找到是否存在前缀可以份为小于等于mid的k份.先求出这n个数的前缀和 ...

  2. 2019HDU多校第三场 Distribution of books 二分 + DP

    题意:给你一个序列,你可以选择序列的一个前缀,把前缀分成k个连续的部分,要求这k个部分的区间和的最大值尽量的小,问这个最小的最大值是多少? 思路:首先看到最大值的最小值,容易想到二分.对于每个二分值m ...

  3. HDU多校第三场 Hdu6606 Distribution of books 线段树优化DP

    Hdu6606 Distribution of books 题意 把一段连续的数字分成k段,不能有空段且段和段之间不能有间隔,但是可以舍去一部分后缀数字,求\(min(max((\sum ai ))\ ...

  4. UVA 714 Copying Books 二分

    题目链接: 题目 Copying Books Time limit: 3.000 seconds 问题描述 Before the invention of book-printing, it was ...

  5. ZOJ 2002 Copying Books 二分 贪心

    传送门:Zoj2002 题目大意:从左到右把一排数字k分,得到最小化最大份,如果有多组解,左边的尽量小. 思路:贪心+二分(参考青蛙过河). 方向:从右向左. 注意:有可能最小化时不够k分.如     ...

  6. UVa 714 Copying Books - 二分答案

    求使最大值最小,可以想到二分答案. 然后再根据题目意思乱搞一下,按要求输出斜杠(这道题觉得就这一个地方难). Code /** * UVa * Problem#12627 * Accepted * T ...

  7. Gym 100425A Luggage Distribution (组合数学,二分)

    一开始想着球盒模型,数据范围大,递推会GG. 用凑的方法来算方案.往n个小球之间插两个隔板,方案是(n-1)*(n-2)/2,不区分盒子,三个盒子小球数各不相同的方案数被算了6次(做排列), 两个相同 ...

  8. [2019杭电多校第三场][hdu6606]Distribution of books(线段树&&dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6606 题意为在n个数中选m(自选)个数,然后把m个数分成k块,使得每块数字之和最大的最小. 求数字和最 ...

  9. HDU校赛 | 2019 Multi-University Training Contest 3

    2019 Multi-University Training Contest 3 http://acm.hdu.edu.cn/contests/contest_show.php?cid=850 100 ...

随机推荐

  1. spring cloud服务间调用feign

    参考文章:Spring Cloud Feign设计原理 1.feign是spring cloud服务间相互调用的组件,声明式.模板化的HTTP客户端.类似的HttpURLConnection.Apac ...

  2. 一个使用Spring的AspectJ LTW的简单例子

    参考:Spring Framework Reference Documentation Spring AOP 实现原理与 CGLIB 应用 比较分析 Spring AOP 和 AspectJ 之间的差 ...

  3. sysbench - 数据库功能及性能测试工具

    sysbench 的 GitHub 参考资料 1.0 之后的版本使用方法跟之前的有所区别,下面所有内容基于 1.0.9 版本. 另外,为了方便管理测试,最好不要通过命令直接运行测试,而是写成脚本自动化 ...

  4. 【FICO系列】SAP FICO模块-固定资产月结的注意点

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[FICO系列]SAP FICO模块-固定资产月 ...

  5. servlet--获取类路径下资源

     context 获取真实路径(*****) 还可以使用ServletContext对象来获取Web应用下的资源,例如在hello应用的根目录下创建a.txt文件,现在想在Servlet中获取这个资源 ...

  6. phpstudy开启PHPSocket扩展(windows系统)

    PHP开启Socket扩展 一.windows系统(本地电脑) 1.打开phpstudy,设置——>配置文件——>打开php.ini(我安装的是PhpStudy v8.0,其他版本请自己找 ...

  7. Angular 输入中的禁止特定输入值--Validator 与 Directive 实现

    1 前言 最近在项目中涉及表单的情况下,需要对用户输入进行过滤,比如填写用户名的时候不可以使用空格或者特殊符号,这里有几个解决方法: 使用 Angular 的正则同步验证器 使用 RxJS对输入的值进 ...

  8. _groovy

    _groovy与beanshell类似,只是它执行的是apache groovy脚本,并返回结果. 如果定义了属性 “groovy.utilities”,属性将会被脚本引擎加载,这样就可以定义一些通用 ...

  9. nmon内存分析

    可参考: MemTotal:显示当前服务器物理内存大小,本服务器有8063180 KB≍7874 MB左右. MemFree:显示当前服务器的空闲内存大小,本服务器有5052336 KB≍4934 M ...

  10. [Linux] 021 RPM 包的安装、升级与卸载

    1. 包全名与包名包全名 包全名:操作的包是没有安装的软件包 使用包全名.而且要注意路径包名 包名:操作已经安装的软件包时,使用 是搜索 /var/lib/rpm/ 中的数 2. 安装 $ rpm - ...