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

题面

洛谷

题解

原来\(NOI\)这么多神仙题。。。

考虑一个极其明显的\(dp\)

设\(f[i]\)表示前\(i\)个句子产生的最小代价

转移也很显然,就懒得写了。

仔细思考一下,转移具有单调性。

但是我们用单调队列似乎无法直接维护。

继续思考一下,我们的转移结果一定是从前面一个位置转移过来的

并且一定是一段连续的位置都由那个位置转移过来。

同时,如果\(i\)从\(j\)转移过来,\(i+1\)从\(k\)转移过来,其中\(j<k\)

那么,一定不存在\(x>i\),使得\(x\)从\(j\)转移。

因此决策也具有单调性。

所以利用一个单调队列来维护一下决策的单调性。

维护一下当前点影响的范围。

每次插入新点的时候,这个点影响的范围一定是一个位置\(x\)到\(n\)

所以二分一下这个位置就好了

时间复杂度\(O(Tnlognlogp)\),复杂度来自于二分+快速幂

又一次成为了cin/cout选手

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define MAX 111111
#define double long double
struct Node{int j,l,r;}Q[MAX];
int a[MAX],n,L,P,h,t,g[MAX],S[MAX],top;
string ch[MAX];
double f[MAX];
ll s[MAX];
double fpow(double a,int b)
{
double s=1;
while(b){if(b&1)s*=a;a*=a;b>>=1;}
return s;
}
double Calc(int i,int j){return f[j]+fpow(fabs(s[i]-s[j]-1-L),P);}
int main()
{
ios::sync_with_stdio(false);
int T;cin>>T;
while(T--)
{
cin>>n>>L>>P;
for(int i=1;i<=n;++i){cin>>ch[i];a[i]=ch[i].length();}
for(int i=1;i<=n;++i)s[i]=s[i-1]+a[i]+1;
memset(Q,0,sizeof(Q));
Q[h=t=1]=(Node){0,1,n};
for(int i=1;i<=n;++i)
{
while(h<t&&Q[h].r<i)++h;
int j=Q[h].j;Q[h].l++;
f[i]=Calc(i,j);g[i]=j;
while(h<t&&Calc(Q[t].l,Q[t].j)>=Calc(Q[t].l,i))--t;
int l=Q[t].l,r=Q[t].r,ret=Q[t].r+1;
while(l<=r)
{
int mid=(l+r)>>1;
if(Calc(mid,i)<=Calc(mid,Q[t].j))ret=mid,r=mid-1;
else l=mid+1;
}
if(ret!=Q[t].l)Q[t].r=ret-1;else --t;
if(ret<=n)Q[++t]=(Node){i,ret,n};
}
if(f[n]>1e18)cout<<"Too hard to arrange"<<endl;
else
{
cout<<(ll)f[n]<<endl;
top=0;
for(int i=n;i;i=g[i])S[++top]=i;S[top+1]=0;
for(int i=top;i;--i)
for(int j=S[i+1]+1;j<=S[i];++j)
{
cout<<ch[j];
if(j!=S[i])cout<<' ';
else cout<<endl;
}
}
cout<<"--------------------"<<endl;
}
return 0;
}

【Luogu1912】【NOI2009】诗人小G(动态规划)的更多相关文章

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

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

  2. 1563: [NOI2009]诗人小G

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

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

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

  4. P1912 [NOI2009]诗人小G

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

  5. LG1912 [NOI2009]诗人小G

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

  6. [NOI2009] 诗人小G [题解]

    诗人小G 题目大意 给出 \(n\) 个长度不超过 \(30\) 的句子,要求你对其进行排版. 对于每一行,有一个规定的行标准长度 \(L\) ,每一行的不协调度等于该行的实际长度与行标准长度差的绝对 ...

  7. 不失一般性和快捷性地判定决策单调(洛谷P1912 [NOI2009]诗人小G)(动态规划,决策单调性,单调队列)

    洛谷题目传送门 闲话 看完洛谷larryzhong巨佬的题解,蒟蒻一脸懵逼 如果哪年NOI(放心我这样的蒟蒻是去不了的)又来个决策单调性优化DP,那蒟蒻是不是会看都看不出来直接爆\(0\)?! 还是要 ...

  8. BZOJ1563 NOI2009诗人小G(动态规划+决策单调性)

    设f[i]为前i行的最小不协调度,转移枚举这一行从哪开始,显然有f[i]=min{f[j]+abs(s[i]-s[j]+i-j-1-m)p}.大胆猜想有决策单调性就好了.证明看起来很麻烦,从略.注意需 ...

  9. NOI2009 诗人小G

    Sol 决策单调性+二分 传说中的四边形不等式...其实做了这道题还是不会... 证明简直吃屎//// 贴个传送门这里有部分分做法还有决策单调性的证明 byvoid ISA tell me that ...

  10. [bzoj1563][NOI2009]诗人小G(决策单调性优化)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1563 分析: 首先可得朴素的方程:f[i]=min{f[j]+|s[j]-j-s[i] ...

随机推荐

  1. java Cannot resolve constructor 不能解析构造函数

    这个报错是因为构造函数要求传入的变量或对象等,必须在调用时传入,否则就无法解析构造函数,这跟调用方法必须把参数传齐了一个道理

  2. jquery.validate使用 - 3

    自定义jquery-validate的验证行为 1: 自定义表单提交 设置submitHandler来自定义表单提交动作 $(".selector").validate({    ...

  3. 【索引】MySQL索引

    一.索引的定义及作用 1. 二.索引的创建及删除 1.1查看表的索引 show index from tblname; 1.2.创建索引 1.22创建普通索引 ALTER TABLE `table_n ...

  4. 详细讲解 A/B 测试关键步骤,快来检查下还有哪些疏漏的知识点

    作为一种对照实验方法,A/B 测试通过比较两个 (或多个) 不同版本之间的差异来验证假设是否正确.该方法将特定测试组从实验其余部分中独立出来,从而得出可靠结果.在被测人不知情且测试场景真实的情况下,A ...

  5. mysql 转换13位数字毫秒时间

    MySQL毫秒值和日期转换,MYSQL内置函数FROM_UNIXTIME: select FROM_UNIXTIME(t.createDate/1000,'%Y-%m-%d %h:%i:%s') as ...

  6. Python:元组操作总结

    Python的元组和列表类似,不同之处在于元组中的元素不能修改(因此元组又称为只读列表),且元组使用小括号而列表使用中括号,如下: tup1=('physics','chemistry',1997,2 ...

  7. OpenCV学习笔记——疑问

    vec3b:表示每一个Vec3b对象中,可以存储3个char(字符型)数据,比如可以用这样的对象,去存储RGB图像中的一个像素点.typedef Vec<uchar, 3> Vec3b; ...

  8. mysql 设置远程登录

    1.本机登录进mysql,并切换到本机mysql数据库下 2. GRANT ALL PRIVILEGES ON *.* TO 'tigase'@'%' IDENTIFIED BY '123456' W ...

  9. 我是IT小小鸟(读后感)

    序 1.兴趣,这本书第一个点讲兴趣,可是在中国填鸭式的教育下,有兴趣也被这种教育给泯灭了. 2.他山之石,可以攻玉.但不可照搬.这点我非常赞同作者的看法.别人东西你拿来,一定要在他的基础上进行创   ...

  10. 处理了一个以前写的java小程序的异常

    之前用java做过0-99的数字和英文之间的翻译,输入数字就会翻译成英文,输入英文会翻译成数字,比如输入56  输出fiftysix   输入fiftysix  输出56, 发现这会有一个异常,当输入 ...