1563: [NOI2009]诗人小G
1563: [NOI2009]诗人小G
https://lydsy.com/JudgeOnline/problem.php?id=1563
分析:
直接转移f[i]=f[j]+cost(i,j),cost(i,j)=(sum[i]-sum[j])p
然后有决策单调性,就可以二分+队列了。注意两个字符串之间还有一个空格,所以长度+1,很多字符串合起来后,总的长度还要-1,最后一个没空格。
证明?byvoid
luogu输出方案,加上后一直过不了,g,nxt数组是输出方案的部分
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
#define fi(s) freopen(s,"r",stdin);
#define fo(s) freopen(s,"w",stdout);
using namespace std;
typedef long long LL;
typedef long double LD; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
const LL INF = 1e18; char str[N][], pr[];
int len[N], g[N], nxt[N];
LD f[N];
LL sum[N];
int n, Len, P;
struct Node{
int p, l, r;
Node() {}
Node(int _,int __,int ___) { p = _, l = __, r = ___; }
}q[N]; LD ksm(LD x) {
LD ans = ; int b = P;
while (b) {
if (b & ) ans = ans * x;
x = x * x;
b >>= ;
}
return ans;
}
void init() {
n = read(), Len = read(), P = read();
for (int i=; i<=n; ++i) {
scanf("%s", str[i] + );
sum[i] = sum[i - ] + (len[i] = strlen(str[i] + ) + );
}
}
LD Calc(int i,int j) {
return f[j] + ksm(abs(sum[i] - sum[j] - Len - ));
}
int binary_search(int l,int r,int x,int y) {
int ans = n;
while (l <= r) {
int mid = (l + r) >> ;
if (Calc(mid, x) < Calc(mid, y)) ans = mid, r = mid - ;
else l = mid + ;
}
return ans;
}
void solve() {
int L = , R = ;
q[++R] = Node(, , n);
for (int i=; i<=n; ++i) {
while (L <= R && q[L].r < i) L ++;
int j = q[L].p;
f[i] = Calc(i, j);
g[i] = j;
if (Calc(n, q[R].p) < Calc(n, i)) continue; // 如果最后一个点从i转移不优,那么说明i没有覆盖的区间,不需要二分了
while (L <= R && Calc(q[R].l, q[R].p) > Calc(q[R].l, i)) R --;
q[R].r = binary_search(q[R].l, n, i, q[R].p) - ;
q[++R] = Node(i, q[R - ].r + , n);
}
}
void print() {
if (f[n] > INF) puts("Too hard to arrange");
else printf("%lld\n", (LL)(f[n]));
puts(pr);
}
int main() {
strcpy(pr, "--------------------");
int T = read();
while (T--) {
init();
solve();
print();
}
return ;
}
1563: [NOI2009]诗人小G的更多相关文章
- [BZOJ] 1563: [NOI2009]诗人小G
1D/1D的方程,代价函数是一个p次函数,典型的决策单调性 用单调队列(其实算单调栈)维护决策点,优化转移 复杂度\(O(nlogn)\) #include<iostream> #incl ...
- bzoj1563: [NOI2009]诗人小G 决策单调性(1D1D)
目录 题目链接 题解 代码 题目链接 bzoj1563: [NOI2009]诗人小G 题解 \(n^2\) 的dp长这样 \(f_i = min(f_j + (sum_i - sum_j - 1 - ...
- [NOI2009]诗人小G --- DP + 决策单调性
[NOI2009]诗人小G 题目描述: 小G是一个出色的诗人,经常作诗自娱自乐. 但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并 ...
- P1912 [NOI2009]诗人小G
P1912 [NOI2009]诗人小G 思路: 平行四边形不等式优化dp 因为f(j, i) = abs(sum[i]-sum[j]+i-j-1-l)^p 满足平行四边形不等式 j < i f( ...
- LG1912 [NOI2009]诗人小G
题意 题目描述 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以 ...
- [NOI2009] 诗人小G [题解]
诗人小G 题目大意 给出 \(n\) 个长度不超过 \(30\) 的句子,要求你对其进行排版. 对于每一行,有一个规定的行标准长度 \(L\) ,每一行的不协调度等于该行的实际长度与行标准长度差的绝对 ...
- 【BZOJ 1563】 [NOI2009]诗人小G
Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超过1018,则输出"Too hard to arr ...
- NOI2009 诗人小G
Sol 决策单调性+二分 传说中的四边形不等式...其实做了这道题还是不会... 证明简直吃屎//// 贴个传送门这里有部分分做法还有决策单调性的证明 byvoid ISA tell me that ...
- 不失一般性和快捷性地判定决策单调(洛谷P1912 [NOI2009]诗人小G)(动态规划,决策单调性,单调队列)
洛谷题目传送门 闲话 看完洛谷larryzhong巨佬的题解,蒟蒻一脸懵逼 如果哪年NOI(放心我这样的蒟蒻是去不了的)又来个决策单调性优化DP,那蒟蒻是不是会看都看不出来直接爆\(0\)?! 还是要 ...
随机推荐
- 1053. [HAOI2007]反素数ant【DFS+结论】
Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x ,则称x为反质数.例如,整数 ...
- Yii2.0 发送文件
1.发送文件 和浏览器跳转类似,文件发送是另一个依赖指定 HTTP 头的功能, Yii 提供方法集合来支持各种文件发送需求,它们对 HTTP 头都有内置的支持. yii\web\Response::s ...
- SpringBoot实战(七)之与Redis进行消息传递
此次教程演示安装的是Window版的Redis, Linux安装Redis可以参考我的这篇博文:Redis的安装和客户端使用注意事项 关于Java连接Redis操作方面可以参考我的这篇博文:Java连 ...
- 获取 当前显示的 UIViewController
UIViewController * findBestVC(UIViewController *vc) { if (vc.presentedViewController) { return findB ...
- pem文件转p12
p12->pem cer.p12: openssl pkcs12 -clcerts -nokeys -out cer.pem -in cer.p12 key.p12: openssl pkcs1 ...
- 《Android应用测试与调试实战》读书笔记
一 本书概述 自动化测试篇:Android应用可以使用Java语言配合SDK,也可以使用HTML5技术,还可以用C/C++语言配合NDK技术编写,本书中涵盖了针对这三种技术编写的应用所采用的测试技术. ...
- Ionic3项目实践记录
Ionic3首次项目实践记录 标签(空格分隔): Angular Ionic Ionic3踩坑 1. 路由懒加载(lazy load) 如果设置了懒加载,就必须全部懒加载(包括TabsPage),否则 ...
- Unbnutu下安装Apache,Mysql,php,phpmyadmin
先写一键部署脚本,肯定是先要知道如何手动安装Apache,Mysql,php,phpmyadmin 一 Apache2的安装 apt install apache2 安装好之后,手动看一下apach ...
- elasticsearch简单的安装以及集群配置详解
首先要确保有java8的环境,安装方法如下(centos) wget --no-check-certificate --no-cookies --header "Cookie: oracle ...
- exynos4412—链接脚本复习
在u-boot下,定义变量, 编译,编译完后 使用arm-linux-nm arm 没有去头的二进制可执行文件 都在BSS段,均为初始化. 打印之后会出算随机值. 目前还处于uboot阶段,如 ...