题目

小G是一个出色的诗人,经常作诗自娱自乐。但是,他一直被一件事情所困扰,那就是诗的排版问题。

一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的。小G给每首诗定义了一个行标准长度(行的长度为一行中符号的总个数),他希望排版后每行的长度都和行标准长度相差不远。显然排版时,不应改变原有的句子顺序,并且小G不允许把一个句子分在两行或者更多的行内。在满足上面两个条件的情况下,小G对于排版中的每行定义了一个不协调度, 为这行的实际长度与行标准长度差值绝对值的P次方,而一个排版的不协调度为所有行不协调度的总和。

小G最近又作了几首诗,现在请你对这首诗进行排版,使得排版后的诗尽量协调(即不协调度尽量小),并把排版的结果告诉他。

思路

需要用到决策单调性中一个叫二分栈(队列)的东西。

转移式子十分显然:
\[ dp[i]=min(dp[j]+w(j,i)) \]
然后打表发现决策是单调的。

重点来了

如何维护决策单调性呢?

决策单调性一般有以下几种维护方法:

  1. 四边形不等式
  2. 二分栈(队列)
  3. CDQ分治套分治
  4. WQS二分

这里先写一下二分栈(队列)

具体而言,这个队列维护的是区间的决策单调性的信息。队列中的元素有3个权值,\(l,r,s\)分别表示区间和这个区间对应的决策点。

假设某一状态下的决策点是:

11112222233344444445555566666777777777777777

那么新加入一个决策点8,它就可以从后往前把7,6,5这些可能不如它优的点弹掉。如果不能弹掉一整个块,就二分弹掉它的一部分,这样我们就成功维护了决策单调性了。

复杂度分析

对于每个决策点来说,它只可能进出队列一次,复杂度为\(O(n)\)。

计算每一个\(dp[i]\),最坏情况下每次都要二分很大的序列,复杂度为\(O(nlogn)\)。

所以总复杂度为\(O(nlogn)\)。

代码

#include<bits/stdc++.h>
#define M 100005
#define LL long double
using namespace std;
const LL inf=1e18;
int n,L,P,T,A[M];
char S[35];
LL sum[M],dp[M];
LL calc(int i,int j){int y=abs(sum[i]-sum[j]+i-j-1-L);LL res=1;for(int i=1;i<=P;i++)res*=y;return dp[j]+res;
}
struct node{int l,r,s;}Q[M];
int main(){freopen("poet.in","r",stdin);freopen("poet.out","w",stdout);scanf("%d",&T);while(T--){scanf("%d%d%d",&n,&L,&P);for(int i=1;i<=n;i++){scanf("%s",S);sum[i]=sum[i-1]+strlen(S);}int l=1,r=0;Q[++r]=(node){1,n,0};for(int i=1;i<=n;i++){dp[i]=calc(i,Q[l].s);if(Q[l].l==Q[l].r)l++;else Q[l].l++;while(l<=r&&calc(Q[r].l,Q[r].s)>calc(Q[r].l,i))r--;if(l>r)Q[++r]=(node){i+1,n,i};else {int L=Q[r].l+1,R=Q[r].r+1;while(L<R){int mid=(L+R)>>1;if(calc(mid,Q[r].s)>calc(mid,i))R=mid;else L=mid+1;}Q[r].r=L-1;if(L<=n)Q[++r]=(node){L,n,i};}}if(dp[n]>1e18)puts("Too hard to arrange");else printf("%.0Lf\n",dp[n]);puts("--------------------");       }return 0;
}

转载于:https://www.cnblogs.com/zryabc/p/11279480.html

NOI2009 诗人小G相关推荐

  1. P1912 [NOI2009]诗人小G

    P1912 [NOI2009]诗人小G 思路: 平行四边形不等式优化dp 因为f(j, i) = abs(sum[i]-sum[j]+i-j-1-l)^p 满足平行四边形不等式 j < i f( ...

  2. 决策单调性Ⅰ:四边形不等式(bzoj 1563: [NOI2009]诗人小G)

    题目描述: 给出n个数字和常数L,你可以任意合并相邻的两个数字a[x]和a[x+1],并得出一个新的数a[x]+a[x+1]+1,一通合并后得到一个有若干个数的序列,这个序列的不协调值为∑|(a[i] ...

  3. BZOJ1563:[NOI2009]诗人小G(决策单调性DP)

    Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超过1018,则输出"Too hard to arr ...

  4. [BZOJ1563][NOI2009]诗人小G[决策单调性优化]

    int T, n, m, l, p, pre[MAXN], q[MAXN], h, t, b[MAXN];//b[i]表示决策点是i的最后一个位置 llf dp[MAXN]; char s1[35]; ...

  5. 【NOI 2009】诗人小G

    [NOI 2009]诗人小G Problem Description 小 \(G\) 是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对 ...

  6. 一个诗人的一生——诗人小G的人生

    看到群里有人说周末作文是以一个诗人的一生为题写作文-于是就突发脑洞写了这么个东西. 哇发出来好羞耻啊(x 诗与人生 某一天,在某一个地方,小G诞生了. 小G原本是有自己的名字的,但是在某一天之后,他就 ...

  7. 【NOI2009】诗人小G【决策单调性dp】

    传送门 设句子加上空格长度前缀和为sss 转移方程为 fi=min⁡1≤j<i{fj+∣si−sj−L−1∣P}f_i=\min_{1\leq j<i}\{f_j+|s_i-s_j-L-1 ...

  8. 【BZOJ1563】【NOI2009】—诗人小G(决策二分栈优化dp)

    传送门 O(n2)dpO(n^2)dpO(n2)dp应该都会吧-- f[i]=min(f[j]+(sum[i]−sum[j]−L)pf[i]=min(f[j]+(sum[i]-sum[j]-L)^pf ...

  9. 洛谷P1912:诗人小G(二分栈、决策单调性)

    二分栈,就是通过二分维护的栈 (逃) 解析 本题的决策单调性可以说是显然 但是本题是同维度(其实只有一维)自左向右转移,分治的写法是不能奏效的 所以我们使用决策点调性的另一种实现方法:二分栈 具体来说 ...

最新文章

  1. java与sql用windows身份连接,使用Windows身份验证将我的Sql Server 2008数据库连接到我的Java项目...
  2. python 做网页_女生30岁以前,怎么早做打算
  3. gRPC客户端创建和调用原理解析
  4. AOJ 558 Cheese(bfs)
  5. mysql命令导出表结构文件夹_mysql,命令导入\导出表结构或数据
  6. nginx1.11.*版本追加安装sticky模块出现问题解决方法
  7. mysql编译卡主_mysql 编译安装以及主从设定
  8. 网上农大计算机应用基础在线作业1答案,东北农业大学网络教育学院计算机应用基础网上作业题及答案.doc...
  9. 使用Servlet上传多张图片——访问提示
  10. 前端学习(2585):vue-cli创建项目
  11. 关于××× 相关收集资料
  12. 程序员,与工程师的区别在哪里? (3)
  13. 信息学奥赛C++语言:哥德巴赫猜想
  14. Python4班平均成绩统计_回首过去,展望未来 | 欢迎大家来到E班第一次主题班会!...
  15. windows脚本bat批处理 关闭显示器 关闭显示器脚本bat
  16. Redis+Nginx+设计模式+Spring全家桶+Dubbo+阿里P8技术精选文档
  17. Tomcat安装步骤及详细配置教程(2022最新版)
  18. Atitit mvc之道 attilax著 1. Atitti mvc的几大概念 2 1.1. Dispatcher Controller 2 1.2. 声明式渲染 2 1.3. 条件与循环
  19. 在Linux上安装centos 7镜像详细步骤
  20. 怎么把两个mp3音频合成一个?

热门文章

  1. 关于联想笔记本不能连接无线网(wifi),注销后重新登录才可以连接
  2. Application的Lock和UnLock
  3. 积分与微分电路 (转)
  4. 批量清空数码照片中的相机设备型号、镜头型号、相机快门次数等拍摄数据
  5. 逻辑回归算法分析及在MLlib中的实现剖析
  6. 深度学习顶会论文投稿策略7步走(附资料)
  7. Linux文件权限查看与修改
  8. 【Java接口】限制App登录次数
  9. 第五代选择器Icarus
  10. SharePoint 2019 Announced: 最新信息