Description

Input

Output

对于每组数据,若最小的不协调度不超过\(10^{18}\),则第一行一个数表示不协调度若最小的不协调度超过\(10^{18}\),则输出"\(Too\;hard\;to\;arrange\)"(不包含引号)。每个输出后面加"\(--------------------\)"。

Sample Input

4

4 9 3

brysj,

hhrhl.

yqqlm,

gsycl.

4 9 2

brysj,

hhrhl.

yqqlm,

gsycl.

1 1005 6

poet

1 1004 6

poet

Sample Output

108

\(--------------------\)

32

\(--------------------\)

Too hard to arrange

\(--------------------\)

1000000000000000000

\(--------------------\)

【样例说明】

前两组输入数据中每行的实际长度均为\(6\),后两组输入数据每行的实际长度均为\(4\)。一个排版方案中每行相邻两个句子之间的空格也算在这行的长度中(可参见样例中第二组数据)。每行末尾没有空格。

Hint

1D1D动态规划裸题。

dp方程:$$f_{i}=min(f_{j}+(pre_{i}-pre_{j}+1)^{p})$$

方便起见,我们在\(pre_{i}\)上加个\(1\),于是dp方程变为$$f_{i}=min(f_{j}+(pre_{i}-pre_{j})^{p})$$

这个方程很明显地满足单调性(令对于\(f_{i}\)的转移\(k\)优于\(j\)(\(k > j\)),则对于\(v>i\)的\(f_{v}\)的转移也有\(k\)优于\(j\))。

斜率优化优化很明显当\(p \ne 2\)是行不通的。所以我们转向\(O(nlogn)\)的1D1D的动态规划。

1D1D动态规划是用二分单调栈来实现的。原理便是决策单调性,对于每个已经确定的\(f_{i}\),看其能更新的那一段后缀为那一段。在单调栈中进行二分,与之前的决策进行比较。不懂可以参考一下代码,代码应该好懂:

  1. #include<cstring>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. using namespace std;
  5. #define limit (1e18)
  6. #define maxn 100010
  7. #define maxm 40
  8. int N,L,P,pre[maxn],top;
  9. char s[maxm];
  10. long double f[maxn];
  11. struct node { int l,r,key; }stack[maxn];
  12. inline long double qsm(int a,int b)
  13. {
  14. long double ret = 1;
  15. while (b--) ret *= 1.0*a;
  16. return ret;
  17. }
  18. inline long double calc(int a,int b)
  19. {
  20. return f[b]+qsm(abs(pre[a]-pre[b]-L),P);
  21. }
  22. inline int find(int a)
  23. {
  24. int l = 1,r = top,mid;
  25. while (l <= r)
  26. {
  27. mid = (l + r) >> 1;
  28. if (stack[mid].l<=a&&stack[mid].r>=a) return stack[mid].key;
  29. if (a < stack[mid].l) r = mid - 1;
  30. else l = mid + 1;
  31. }
  32. }
  33. inline void updata(int now)
  34. {
  35. int l = 1,r;
  36. while (top)
  37. {
  38. if (calc(stack[top].l,stack[top].key) >= calc(stack[top].l,now))
  39. --top;
  40. else
  41. {
  42. l = stack[top].l,r = stack[top].r;
  43. while (l <= r)
  44. {
  45. int mid = (l + r) >> 1;
  46. if (calc(mid,stack[top].key) >= calc(mid,now)) r = mid - 1;
  47. else l = mid + 1;
  48. }
  49. stack[top].r = r;
  50. break;
  51. }
  52. }
  53. if (l <= N) stack[++top] = (node){l,N,now};
  54. }
  55. inline void dp()
  56. {
  57. f[0] = 0;
  58. stack[top = 1] = (node) {1,N,0};
  59. for (int i = 1;i <= N;++i)
  60. {
  61. int key = find(i);
  62. f[i] = calc(i,key);
  63. updata(i);
  64. }
  65. }
  66. int main()
  67. {
  68. freopen("1563.in","r",stdin);
  69. freopen("1563.out","w",stdout);
  70. int T; scanf("%d",&T);
  71. while (T--)
  72. {
  73. scanf("%d %d %d\n",&N,&L,&P);
  74. L++;
  75. for (int i = 1;i <= N;++i)
  76. {
  77. scanf("%s",s);
  78. pre[i] = strlen(s)+1+pre[i-1];
  79. }
  80. dp();
  81. if (f[N] > limit) printf("Too hard to arrange\n");
  82. else printf("%.0Lf\n",f[N]);
  83. printf("--------------------\n");
  84. }
  85. fclose(stdin); fclose(stdout);
  86. return 0;
  87. }

BZOJ 1563 诗人小G的更多相关文章

  1. [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性)

    [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性) 题面 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的.小 G ...

  2. 1563: [NOI2009]诗人小G

    1563: [NOI2009]诗人小G https://lydsy.com/JudgeOnline/problem.php?id=1563 分析: 直接转移f[i]=f[j]+cost(i,j),co ...

  3. C++之路进阶——codevs2933(诗人小G)

    2933 诗人小G 2009年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 小G是一个出色的诗人 ...

  4. LG1912 [NOI2009]诗人小G

    题意 题目描述 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以 ...

  5. bzoj1563: [NOI2009]诗人小G 决策单调性(1D1D)

    目录 题目链接 题解 代码 题目链接 bzoj1563: [NOI2009]诗人小G 题解 \(n^2\) 的dp长这样 \(f_i = min(f_j + (sum_i - sum_j - 1 - ...

  6. 【Luogu1912】【NOI2009】诗人小G(动态规划)

    [Luogu1912][NOI2009]诗人小G(动态规划) 题面 洛谷 题解 原来\(NOI\)这么多神仙题... 考虑一个极其明显的\(dp\) 设\(f[i]\)表示前\(i\)个句子产生的最小 ...

  7. BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】

    题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...

  8. [NOI2009]诗人小G --- DP + 决策单调性

    [NOI2009]诗人小G 题目描述: 小G是一个出色的诗人,经常作诗自娱自乐. 但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并 ...

  9. NOI 2009A 诗人小G

    NOI 2009A 诗人小G 诗人小G [问题描述] 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们 ...

随机推荐

  1. VS编辑代码的时候,都会自动在资源浏览器里将文件所在项目展开

    如何设置VS编辑代码的时候,都会自动在资源浏览器里将文件所在项目展开 工具-选项-项目和解决方案-常规-在解决方案资源管理器中跟踪活动项(C)

  2. 使用systemtap调试linux内核

    http://blog.csdn.net/heli007/article/details/7187748 http://linux.chinaunix.net/docs/2006-12-15/3479 ...

  3. 初步掌握HDFS的架构及原理

    目录 HDFS 是做什么的 HDFS 从何而来 为什么选择 HDFS 存储数据 HDFS 如何存储数据 HDFS 如何读取文件 HDFS 如何写入文件 HDFS 副本存放策略 Hadoop2.x新特性 ...

  4. auth tips

    https://scotch.io/tutorials/easy-node-authentication-setup-and-local https://scotch.io/tutorials/upg ...

  5. Java基础知识强化之集合框架笔记15:List集合的特点

    1. List集合的特点 List本身也是一个接口,如下: public interface List<E> extends Collection<E> (1)List是有序的 ...

  6. Objective-C:KVO

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  7. C#压缩文件为zip格式

    Vercher   C#压缩文件为zip格式 需要ICSharpCode.SharpZipLib.dll,网上下载的到. 代码是从网上找来的: 1 public class ZipClass 2 { ...

  8. MyTask2

    先把核心代码贴上 public void solve() { //Console.WriteLine("请输入你需要生成多少人的数据以及年龄最大值(75以内):"); //int ...

  9. C# 数字证书微信API调用使用参考事例

    X.509 v.3 证书的方法.一个比较完整的调用  微信  API的示例: private stringGetResponseResult()         { string strRespons ...

  10. iOS将产品进行多语言发布,开发

    多语言就是程序的国际化.在Xcode中要实现程序的国际化,只需要简单配置,并修改相应的字符串键值对即可. 应用程序的国际化主要包括三个方面:A.程序名称国际化:B.程序内容国际化:C.程序资源国际化 ...