【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. C#--Switch Case语句的返回

    C#中switch case语句的返回不只是用break关键字,break语句是用来阻止贯穿的最常见的方式.也可以用其他语句来替代它.如下面代码所示 static int Main(string[] ...

  2. nuget必备插件(待续)

    DevLib.ExtensionMethods Extend Z.ExtensionMethods

  3. 添加jQuery方法解析url查询部分

    Web前端不同页面间传值可以使用 cookies.localStorage 和 sessionStorage 等本地存储. 但是,今天我们尝试使用 url 查询,假设我们要传递字符串 str 到 mo ...

  4. Java or Python?测试开发工程师如何选择合适的编程语言?

    很多测试开发工程师尤其是刚入行的同学对编程语言和技术栈选择问题特别关注,毕竟掌握一门编程语言要花不少时间成本,也直接关系到未来的面试和就业(不同企业/项目对技术栈要求也不一样),根据自身情况做一个相对 ...

  5. Ubuntu 16.04 主题美化及常用软件安装

    一.主题美化 系统清理 系统更新: 安装完系统之后,需要更新一些补丁.Ctrl+Alt+T调出终端,执行一下代码: sudo apt-get update sudo apt-get upgrade 卸 ...

  6. git实验

    四.实例应用 应用1.现有项目移植到git代管 进入目标项目,进行git初始化: 初始化:git init 修改config:git config -- local user.name '名称'  和 ...

  7. python3【基础】-list&tuple

    一.list概述 list (列表)是python中最常用的数据类型之一,通过列表可以对数据实现最方便的存储,修改等操作.在python3中,list支持如下方法: Help on class lis ...

  8. PSP Daily——团队项目Alpha发布

    视频展示:优酷视频链接.文案如下 PSP Daily软件NABCD分析: 1) N (Need 需求) PSP Daily 解决了用户(软件工程课上学生)记录例行报告.写每周PSP表格和统计的需求.潜 ...

  9. Python:迭代器的简单理解

    一.什么是迭代器 迭代,顾名思义就是重复做一些事很多次(就现在循环中做的那样).迭代器是实现了__next__()方法的对象(这个方法在调用时不需要任何参数),它是访问可迭代序列的一种方式,通常其从序 ...

  10. 运维学习笔记(三)之T01-03TCP/IP

    TCP/IP协议 简介 通信协议 信息从源传递到目的地的过程中,网络上各设备需要通信,描述网络通信“语言”的规范就是协议. 数据通信协议 决定数据的格式和传输的一组规则. TCP/IP协议简介 一组通 ...