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}\),看其能更新的那一段后缀为那一段。在单调栈中进行二分,与之前的决策进行比较。不懂可以参考一下代码,代码应该好懂:

#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std; #define limit (1e18)
#define maxn 100010
#define maxm 40
int N,L,P,pre[maxn],top;
char s[maxm];
long double f[maxn];
struct node { int l,r,key; }stack[maxn]; inline long double qsm(int a,int b)
{
long double ret = 1;
while (b--) ret *= 1.0*a;
return ret;
} inline long double calc(int a,int b)
{
return f[b]+qsm(abs(pre[a]-pre[b]-L),P);
} inline int find(int a)
{
int l = 1,r = top,mid;
while (l <= r)
{
mid = (l + r) >> 1;
if (stack[mid].l<=a&&stack[mid].r>=a) return stack[mid].key;
if (a < stack[mid].l) r = mid - 1;
else l = mid + 1;
}
} inline void updata(int now)
{
int l = 1,r;
while (top)
{
if (calc(stack[top].l,stack[top].key) >= calc(stack[top].l,now))
--top;
else
{
l = stack[top].l,r = stack[top].r;
while (l <= r)
{
int mid = (l + r) >> 1;
if (calc(mid,stack[top].key) >= calc(mid,now)) r = mid - 1;
else l = mid + 1;
}
stack[top].r = r;
break;
}
}
if (l <= N) stack[++top] = (node){l,N,now};
} inline void dp()
{
f[0] = 0;
stack[top = 1] = (node) {1,N,0};
for (int i = 1;i <= N;++i)
{
int key = find(i);
f[i] = calc(i,key);
updata(i);
}
} int main()
{
freopen("1563.in","r",stdin);
freopen("1563.out","w",stdout);
int T; scanf("%d",&T);
while (T--)
{
scanf("%d %d %d\n",&N,&L,&P);
L++;
for (int i = 1;i <= N;++i)
{
scanf("%s",s);
pre[i] = strlen(s)+1+pre[i-1];
}
dp();
if (f[N] > limit) printf("Too hard to arrange\n");
else printf("%.0Lf\n",f[N]);
printf("--------------------\n");
}
fclose(stdin); fclose(stdout);
return 0;
}

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. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(43)-工作流设计-字段分类设计

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(43)-工作流设计-字段分类设计 系列目录 建立好42节的表之后,每个字段英文表示都是有意义的说明.先建立 ...

  2. OC的单例模式的实现

    下面是在ARC,GCD下的单例模式实现: 头文件里申明类方法getInstance: #import <Foundation/Foundation.h> @interface Single ...

  3. POJ 2750 Potted Flower

    Potted Flower Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3872   Accepted: 1446 Des ...

  4. MapReduce输出格式

    针对前面介绍的输入格式,MapReduce也有相应的输出格式.默认情况下只有一个 Reduce,输出只有一个文件,默认文件名为 part-r-00000,输出文件的个数与 Reduce 的个数一致. ...

  5. D2JS 的数据绑定

    D2JS 将数据绑定视为"对象-路径-渲染/收集 "组成.主要 DOM  元素和对象绑定,称为 d2js.root,非主要元素指定数据路径,通过路径定位到值,根据值可进行渲染或收集 ...

  6. 第二篇:python高级之装饰器

    python高级之装饰器   python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函 ...

  7. iOS Safari 中点击事件失效的解决办法

    问题描述 当使用委托给一个元素添加click事件时,如果事件是委托到 document 或 body 上,并且委托的元素是默认不可点击的(如 div, span 等),此时 click 事件会失效. ...

  8. Java_Activiti5_菜鸟也来学Activiti5工作流_之与Spring集成(三)

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. hive hbase pig 区别

    参考文档http://www.linuxidc.com/Linux/2014-03/98978.htm

  10. 利用bat批量执行脚本文件

    1.读取目录文件 利用bat 的for命令读取中的sql文件 for /r %%c in (0*.sql) do echo %%c %%c 相当于变量 in() 中的为循环的范围 此句的作用是显示当前 ...