1044: [HAOI2008]木棍分割

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1393  Solved: 497
[Submit][Status]

Description

有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且输出有多少种砍的方法使得总长度最大的一段长度最小. 并将结果mod 10007。。。

Input

输入文件第一行有2个数n,m. 接下来n行每行一个正整数Li,表示第i根木棍的长度.

Output

输出有2个数, 第一个数是总长度最大的一段的长度最小值, 第二个数是有多少种砍的方法使得满足条件.

Sample Input

3 2
1
1
10

Sample Output

10 2

两种砍的方法: (1)(1)(10)和(1 1)(10)
数据范围
n<=50000, 0<=m<=min(n-1,1000).
1<=Li<=1000.

前半部分为极水的二分,后半部分的DP优化很经典.用f[i][j]表示砍了i此到第j个末的方法种数,直接用一般的DP暴空间+时间,改为滚动数组后还是TLE。可以发现DP中后一层完全有前一层的一个连续区间决定的,且这些区间起点终点都是递增的。便可借此优化。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. #define MAXN 50010
  7. #define MAXM 1010
  8. #define VAL1 10007
  9. #define VAL2 1100
  10. int le[MAXN];
  11. int n,m;
  12. int f[][MAXN];
  13. int ps[MAXN];
  14.  
  15. bool ok(int x)
  16. {
  17. int nowl=,tt=m;
  18. int i;
  19. for (i=;i<=n;i++)
  20. {
  21. if (le[i]>x)return false;
  22. nowl+=le[i];
  23. if (nowl>x)
  24. {
  25. nowl=le[i];
  26. tt--;
  27. if (tt==-)return false;
  28. }
  29. }
  30. if (tt<=-)return false;
  31. return true;
  32. }
  33. void deal(int &x,int y)
  34. {
  35. x+=y;x%=VAL1;
  36. }
  37. int q[MAXN*];
  38. int main()
  39. {
  40. freopen("input.txt","r",stdin);
  41. int i,j;
  42. scanf("%d%d",&n,&m);
  43. int sum=;
  44. for (i=;i<=n;i++)scanf("%d",le+i),sum+=le[i];
  45. for (i=;i<=n;i++)ps[i]=ps[i-]+le[i];
  46. ps[]=le[];
  47. int ans1,ans2=;
  48. int l=,r=sum,mid;
  49. while (l+<r)
  50. {
  51. mid=(l+r)>>;;
  52. if (ok(mid))
  53. {
  54. r=mid;
  55. }else
  56. {
  57. l=mid;
  58. }
  59. }
  60. ans1=r;
  61. int * a,*b;
  62. int ope,clo,res;
  63. f[][]=;
  64. a=f[];b=f[];
  65. for (i=;i<m;i++)
  66. {
  67. res=a[];
  68. ope=,clo=;
  69. q[]=;
  70. for (j=;j<=n;j++)
  71. {
  72. while (ope<=clo&&ps[j]-ps[q[ope]]>ans1)
  73. {
  74. res-=a[ope++];
  75. if(res<)res+=VAL1;
  76. }
  77. b[j]=res;
  78. res+=a[++clo];
  79. q[clo]=j;
  80. res%=VAL1;
  81. }
  82. for (j=n-;j>=;j--)//这里不是n,Wa了好久
  83. {
  84. if (ps[n]-ps[j]>ans1)break;
  85. ans2+=b[j];
  86. ans2%=VAL1;
  87. }
  88. memset(a,,sizeof(int)*MAXN);
  89. swap(a,b);
  90. }
  91.  
  92. /*
  93. f[0][0]=1;
  94. for (i=1;i<=n;i++)
  95. {
  96. for (j=i;j>0;j--)
  97. {
  98. if (ps[i]-ps[j-1]>ans1)break;
  99. for (k=0;k<m;k++)
  100. {
  101. deal(f[i%VAL2][k+1],f[(j-1)%VAL2][k]);
  102. }
  103. }
  104. }
  105. for (i=n;i>=1;i--)
  106. {
  107. if (ps[n]-ps[i]>ans1)break;
  108. ans2=(ans2+f[i%VAL2][m])%VAL1;
  109. }*/
  110. printf("%d %d\n",ans1,ans2);
  111.  
  112. }

BZOJ 1044的更多相关文章

  1. [BZOJ 1044] [HAOI2008] 木棍分割 【二分 + DP】

    题目链接:BZOJ 1044 第一问是一个十分显然的二分,贪心Check(),很容易就能求出最小的最大长度 Len . 第二问求方案总数,使用 DP 求解. 使用前缀和,令 Sum[i] 为前 i 根 ...

  2. BZOJ 1044 木棍分割 解题报告(二分+DP)

    来到机房刷了一道水(bian’tai)题.题目思想非常简单易懂(我的做法实际上参考了Evensgn 范学长,在此多谢范学长了) 题目摆上: 1044: [HAOI2008]木棍分割 Time Limi ...

  3. BZOJ 1044: [HAOI2008]木棍分割

    Description 求 \(n\) 根木棍长度为 \(L\) ,分成 \(m\) 份,使最长长度最短,并求出方案数. Sol 二分+DP. 二分很简单啊,然后就是方案数的求法. 状态就是 \(f[ ...

  4. BZOJ 1044: [HAOI2008]木棍分割(二分答案 + dp)

    第一问可以二分答案,然后贪心来判断. 第二问dp, dp[i][j] = sigma(dp[k][j - 1]) (1 <= k <i, sum[i] - sum[k] <= ans ...

  5. BZOJ 1044: [HAOI2008]木棍分割 DP 前缀和优化

    题目链接 咳咳咳,第一次没大看题解做DP 以前的我应该是这样的 哇咔咔,这tm咋做,不管了,先看个题解,再写代码 终于看懂了,卧槽咋写啊,算了还是抄吧 第一问类似于noip的那个跳房子,随便做 这里重 ...

  6. bzoj 1044 [HAOI2008]木棍分割(二分+贪心,DP+优化)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1044 [题意] n根木棍拼到一起,最多可以切m刀,问切成后最大段的最小值及其方案数. ...

  7. bzoj 1044 [HAOI2008]木棍分割——前缀和优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1044 前缀和优化. 但开成long long会T.(仔细一看不用开long long) #i ...

  8. bzoj 1044 贪心二分+DP

    原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1044 首先对于第一问,我们可以轻易的用二分答案来搞定,对于每一个二分到的mid值 我们从l ...

  9. BZOJ 1044 木棍分割(二分答案 + DP优化)

    题目链接  木棍分割 1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3830  Solved: 1453[S ...

随机推荐

  1. UIStackView 看我就够了

    介绍 UIStackView 是 iOS9新增的一个布局技术.熟练掌握相当节省布局时间. UIStackView 是 UIView 的子类,是用来约束子控件的一个控件.但他的作用仅限于此,他不能用来呈 ...

  2. hdu1250(Java)大数相加的问题

    Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...

  3. 通过定时监听input框来实现onkeyup事件-

    问题:因为zepto无法使用onkeyup 事件 解决方法:通过给input框绑定focus 事件,定时的去监听input的值得改变,在鼠标移出input后,清除定时器 <!DOCTYPE ht ...

  4. js中对象的创建

    json方式,构造函数方式,Object方式,属性的删除和对象的销毁 <html> <head> <title>js中的对象的创建</title> &l ...

  5. java 用eclipse j2ee写的servlet 程序,WEB-INF下的配置文件web.xml在哪啊?谢谢!

    我用的版本是tomcat7.0,在webcontent\web-inf里只有一个空文件夹lib,写完servlet 类程序,就可以运行了,我想知道自动生成的配置文件在哪里?或者说从哪里能够看出来配置内 ...

  6. Asp.Net Core简单整理

    1.Asp.NetCore 中文入门文档 http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-index.html

  7. 20160420javaweb之文件上传和下载

    一.文件上传 1.提供表单允许用户通过表单选择文件进行上传 表单必须是POST提交 文件输入框必须有name属性,只有有name属性的输入项浏览器才会进行提交 需要设置enctype属性值为multi ...

  8. 各种排序算法及c语言实现

    插入排序O(n^2) 冒泡排序 O(n^2) 选择排序 O(n^2) 快速排序 O(n log n) 堆排序 O(n log n) 归并排序 O(n log n) 希尔排序 O(n^1.25) 1.插 ...

  9. php 5.3 配置mssql笔记

    参考URL  https://docs.moodle.org/29/en/Installing_MSSQL_for_PHP#Using_FreeTDS_on_Debian_Lenny 第一步,下载相应 ...

  10. Spring 和 MyBatis 环境整合

    本案例主要是讲述Spring  和  MyBatis 的环境整合 , 对页面功能的实现并没有做的很完整 先附上本案例的结构 1 . 创建项目并导入相关jar包 commons-collections4 ...