解题:NOI 2009 诗人小G
今天考试考了,于是开始糊学决策单调性DP
这是一个完全不会优化DP的人
决策单调性DP的一种优化方法是用单调队列优化
存下{左端点l,右端点r,最优决策点p}的三元组,按照单调队列的通常操作来说:
(0.初始化,将整个序列丢进去)
1.弹队头:弹掉所有不合法的三元组(r<i的)
2.求答案,同时更新队头的左端点
3.弹队尾:
①如果队尾的决策点不如i优,说明队尾这整个三元组当前的决策点太靠前了,直接弹掉
②当弹不掉时,根据决策单调性,队尾这个三元组后面的一部分决策点是i,前面的不是,二分出这个位置来修改。当然如果你发现事实上决策点在l就可以直接把整个都弹了=。=
4.入队(没啥可说的)
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lli long long
#define double long double
using namespace std;
const int N=;
const lli inf=1e18;
struct a
{
int l,r,p;
}que[N];
int T,n,m,k,f,b,top,pre[N],stk[N];
lli len[N]; double dp[N]; char str[N][];
double Qpow(double x,int k)
{
if(k==) return x;
double tmp=Qpow(x,k/);
return k%?tmp*tmp*x:tmp*tmp;
}
double Calc(int a,int b)
{
return dp[b]+Qpow(fabs(len[a]-len[b]-m-),k);
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++)
{
scanf("%s",str[i]+);
len[i]=len[i-]+strlen(str[i]+)+;
}
que[f=b=]=(a){,n,};
for(int i=;i<=n;i++)
{
while(f<b&&que[f].r<i) f++;
int pt=que[f].p; que[f].l++;
dp[i]=Calc(i,pt),pre[i]=pt;
while(f<b&&Calc(que[b].l,que[b].p)>=Calc(que[b].l,i)) b--;
int lp=que[b].l,rp=que[b].r,ps=rp+;
while(lp<=rp)
{
int mid=(lp+rp)/;
if(Calc(mid,i)<=Calc(mid,que[b].p)) rp=mid-,ps=mid;
else lp=mid+;
}
(ps==que[b].l)?b--:que[b].r=ps-;
if(ps<=n) que[++b]=(a){ps,n,i};
}
if(dp[n]>inf) puts("Too hard to arrange");
else
{
printf("%lld\n",(lli)dp[n]),top=;
for(int i=n;i;i=pre[i]) stk[++top]=i; stk[++top]=;
for(int i=top;i;i--)
for(int j=stk[i+]+;j<=stk[i];j++)
{
printf("%s",str[j]+);
j==stk[i]?puts(""):putchar(' ');
}
}
puts("--------------------");
}
return ;
}
解题:NOI 2009 诗人小G的更多相关文章
- [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性)
[BZOJ 1563] [NOI 2009] 诗人小G(决策单调性) 题面 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的.小 G ...
- NOI 2009 诗人小G
题目描述 Description 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行 ...
- NOI 2009A 诗人小G
NOI 2009A 诗人小G 诗人小G [问题描述] 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们 ...
- C++之路进阶——codevs2933(诗人小G)
2933 诗人小G 2009年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 小G是一个出色的诗人 ...
- 【Luogu1912】【NOI2009】诗人小G(动态规划)
[Luogu1912][NOI2009]诗人小G(动态规划) 题面 洛谷 题解 原来\(NOI\)这么多神仙题... 考虑一个极其明显的\(dp\) 设\(f[i]\)表示前\(i\)个句子产生的最小 ...
- LG1912 [NOI2009]诗人小G
题意 题目描述 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以 ...
- bzoj1563: [NOI2009]诗人小G 决策单调性(1D1D)
目录 题目链接 题解 代码 题目链接 bzoj1563: [NOI2009]诗人小G 题解 \(n^2\) 的dp长这样 \(f_i = min(f_j + (sum_i - sum_j - 1 - ...
- 1563: [NOI2009]诗人小G
1563: [NOI2009]诗人小G https://lydsy.com/JudgeOnline/problem.php?id=1563 分析: 直接转移f[i]=f[j]+cost(i,j),co ...
- BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】
题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...
随机推荐
- Android Studio com.android.support:percent 导入错误 - 转
看第一行代码(第二版的)书,讲了一个关于PercentFrameLayout和PercentRelativeLayout的部分,书上在build.gradle中导入了com.android.suppo ...
- Tomcat端口被占用解决方案
Tomcat端口被占用解决方法 1.在dos下,输入 netstat -ano|findstr 8080 //说明:查看占用8080端口的进程,显示占用端口的进程 2.taskkill /pid 19 ...
- WPF编程,C#中对话框自动关闭的一种方法。
原文:WPF编程,C#中对话框自动关闭的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/8 ...
- 【LG1368】工艺
[LG1368]工艺 题面 洛谷 题解 好套路的一道题... 我们倍长这个字符串,然后我们要查询的串就为这个倍长过后串的长度\(n\)一个子串,要求字典序最小 然后就可以非常愉快地后缀排序了 后缀的话 ...
- 分布式事务的CAP理论 与BASE理论
CAP理论 一个经典的分布式系统理论.CAP理论告诉我们:一个分布式系统不可能同时满足一致性(C:Consistency).可用性(A:Availability)和分区容错性(P:Partition ...
- Verilog HDL数组(存储器)操作
本文从本人的163博客搬迁至此. 引用了http://blog.sina.com.cn/s/blog_9424755f0101rhrh.html Verilog HDL中常采用数组方式来对存储器进行建 ...
- 机器学习初入门01-numpy的基础用法
一.numpy基础结构 1. numpy.genformtxt('路径名', delimiter = '分割符', dytype = 读取方式如str ):读取一个文件,返回一个numpy.ndarr ...
- 微软职位内部推荐-Principal Software Eng Mgr
微软近期Open的职位: Job Title:   Principal Software Eng Mgr Work Location: Shanghai, China Job Desc ...
- 三种迭代Java ArrayList方法及比较
闲来无事,研究一下Java Collection,首先是ArrayList. 通过三种方式遍历了长度为100000的ArrayList. import java.util.*; public clas ...
- PAT甲题题解-1105. Spiral Matrix (25)-(模拟顺时针矩阵)
题意:给定N,以及N个数.找出满足m*n=N且m>=n且m-n最小的m.n值,建立大小为m*n矩阵,将N个数从大到下顺时针填入矩阵中. #include <iostream> #in ...