1563: [NOI2009]诗人小G

Time Limit: 100 Sec  Memory Limit: 64 MB
Submit: 2611  Solved: 840

Description

Input

Output

对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超过1018,则输出"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

总共10个测试点,数据范围满足:

测试点 T N L P
1 ≤10 ≤18 ≤100 ≤5
2 ≤10 ≤2000 ≤60000 ≤10
3 ≤10 ≤2000 ≤60000 ≤10
4 ≤5 ≤100000 ≤200 ≤10
5 ≤5 ≤100000 ≤200 ≤10
6 ≤5 ≤100000 ≤3000000 2
7 ≤5 ≤100000 ≤3000000 2
8 ≤5 ≤100000 ≤3000000 ≤10
9 ≤5 ≤100000 ≤3000000 ≤10
10 ≤5 ≤100000 ≤3000000 ≤10
所有测试点中均满足句子长度不超过30。

Source

【分析】

  BZOJ1010玩具装箱的加强版。这里是^p不是平方。

  这个是经典的1D/1D形式?【所谓1D/1D动态规划,指的是状态数为O(n),每一个状态决策量为O(n)的动态规划方程。】

  可以看:1D/1D动态规划优化初步这题是经典的模型一

  

  证明自己化式子啊。。

  然后就是决策单调的意思,最优取值点不断右移。

  

  

  这个为什么我觉得写栈有点尴尬【要二分两次?】,双向链表就很好啊~~

  st[i]表示i这个点的决策区间的起始位置,结束位置为nt的起始的前一位或n。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
#define LD long double
#define Maxn 100010
const long double INF=1e18; char s[];
LD a[Maxn],f[Maxn],len[Maxn],sm[Maxn],L;
int lt[Maxn],nt[Maxn],st[Maxn],P; LD qpow(LD x,int b)
{
if(x<) x=-x;
LD ans=1.0;
while(b)
{
if(b&) ans*=x;
x*=x;
b>>=;
}
return ans;
} LD cal(int i,int j)
{
return f[j]+qpow(sm[i]-sm[j]+(LD)i-(LD)j-1.0-L,P);
} bool check(int mid,int x,int y)
{
return cal(mid,x)>=cal(mid,y);
} int n;
int ffind(int l,int r,int x,int y)
{
int ans=n+;
while(l<=r)
{
int mid=(l+r)>>;
if(check(mid,x,y)) ans=mid,r=mid-;
else l=mid+;
}
return ans;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
cin>>n>>L>>P;sm[]=;
for(int i=;i<=n;i++)
{
scanf("%s",s);len[i]=(LD)strlen(s);
sm[i]=sm[i-]+len[i];
}
for(int i=;i<=n;i++) f[i]=INF+,st[i]=n+,lt[i]=i-,nt[i]=i+;
f[]=;st[]=;
int now=;
for(int i=;i<=n;i++)
{
while(st[nt[now]]<=i) now=nt[now];
f[i]=cal(i,now);
while(st[lt[i]]>i)
{
if(check(st[lt[i]],lt[i],i))
{
lt[i]=lt[lt[i]];
nt[lt[i]]=i;
}
else break;
}
st[i]=ffind(st[lt[i]],n,lt[i],i);
if(st[i]>n) nt[lt[i]]=nt[i],lt[nt[i]]=lt[i];
}
if(f[n]>INF) printf("Too hard to arrange\n");
else cout<<(LL)f[n]<<endl;
printf("--------------------\n");
}
return ;
}

2017-04-26 10:06:39

【BZOJ 1563】 (四边形优化、决策单调性)的更多相关文章

  1. [HNOI2008]玩具装箱TOY --- DP + 斜率优化 / 决策单调性

    [HNOI2008]玩具装箱TOY 题目描述: P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京. 他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器 ...

  2. [CF1101F]Trucks and Cities:分治优化决策单调性

    分析 好像是有一个叫这个名字的算法,链接. 令\(f[i][j][k]\)表示一辆每公里耗油量为\(1\)的货车从\(i\)到\(j\)中途加\(k\)次油最小的油箱容量.枚举所有的起点和中途加油的次 ...

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

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

  4. CF868F Yet Another Minimization Problem 分治决策单调性优化DP

    题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...

  5. [NOI2009]诗人小G 决策单调性优化DP

    第一次写这种二分来优化决策单调性的问题.... 调了好久,,,各种细节问题 显然有DP方程: $f[i]=min(f[j] + qpow(abs(sum[i] - sum[j] - L - 1))); ...

  6. hdu 2829(四边形优化 && 枚举最后一个放炸弹的地方)

    Lawrence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. 四边形优化dp

    理解: http://blog.renren.com/share/263498909/1064362501 http://www.cnblogs.com/ronaflx/archive/2011/03 ...

  8. CF321E Ciel and Gondolas Wqs二分 四边形不等式优化dp 决策单调性

    LINK:CF321E Ciel and Gondolas 很少遇到这么有意思的题目了.虽然很套路.. 容易想到dp \(f_{i,j}\)表示前i段分了j段的最小值 转移需要维护一个\(cost(i ...

  9. dp优化---四边形不等式与决策单调性

    四边形不等式 定理1: 设w(x,y)为定义在整数集合上的二元函数,若存在任意整数a,b,c,d(a<=b<=c<=d),并且w(a,d)+w(b,c)>=w(a,c)+w(b ...

  10. 决策单调性优化dp

    决策单调性: 对于一些dp方程,经过一系列的猜想和证明,可以得出,所有取的最优解的转移点(即决策点)位置是单调递增的. 即:假设f[i]=min(f[j]+b[j]) (j<i) 并且,对于任意 ...

随机推荐

  1. get请求中的url encode问题

    首先发表一下感慨,Python的requests模块确实太简便,省却了很多的转码等等等等的问题,但这也是缺点,对于我这种基础不好的同学来说让我少知道了许多本来应该知道的东西. url encode: ...

  2. Hadoop生态圈-zookeeper的API用法详解

    Hadoop生态圈-zookeeper的API用法详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.测试前准备 1>.开启集群 [yinzhengjie@s101 ~] ...

  3. dynamic

    dynamic的特性很多,好像和反射也有关,不过这里先介绍一个特性,关于反射的再补充. 我们来看一个方法: public virtual ActionResult Insert(T info) 有一个 ...

  4. .net MVC入门

    这里面之所以没有Sql语句但是也可以对数据库进行数据操作的原因就是Entity Framework.Entity Framework有三种模式,这里用的是Models模式. 网上有太多的.net MV ...

  5. Redis 学习小记

    由于是学习笔记,我就不来各种啰嗦,介绍这个介绍那个,也不上交给国家,或者各种对比,相信如果你真心用 redis 的话,就不会去跟 MySql,Memcached,MongoDB 等做对比了. 我原先用 ...

  6. javascript数组赋值操作

    最近在司徒正美的<javascript框架设计>,在里面发现了一个段代码 ...... var _len = arr1.length; while (_len) { arr2[--_len ...

  7. 20155315 2016-2017-2 《Java程序设计》第七周学习总结

    教材学习内容总结 第12章 Lambda语法 Lambda定义 一个不用被绑定到一个标识符上,并且可能被调用的函数. 在只有Lambda表达式的情况下,参数的类型必须写出来,如果有目标类型的话,在编译 ...

  8. HDU 1005 Number Sequence (模拟)

    题目链接 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f( ...

  9. 利用iis虚拟目录实现文件服务器功能

    要求说明: 通过网站上传文件保存到统一的文件服务器上. 服务器说明: 1.文件服务器以下称为FilesServer,IP地址为:192.168.1.213 2.Web服务器为以下称为WebServer ...

  10. CentOS安装SVN客户端(rpm)

    http://mirrors.163.com/centos/6/os/x86_64/Packages/ 1.检查是已经安装了svn: rpm -qa subversion subversion-1.7 ...