P1912-[NOI2009]诗人小G【四边形不等式,单调队列】
正题
题目链接:https://www.luogu.com.cn/problem/P1912
题目大意
给出\(n\)个字符串,把这些字符串依次用空格(算一个长度)连接分成若干段,若一段长度为\(x\),那么代价是\(|x-L|^P\)
求代价和最小的方案,如果代价大于\(1e18\)则输出其他东西
\(1\leq n\leq 10^5,1\leq L\leq 3\times 10^6,1\leq P\leq 10\)
解题思路
\(s_i\)表示前\(i\)个字符串的长度和加\(i\),那么有转移方程
\]
这个转移很麻烦不能直接用单调队列之类的优化,但是它满足四边形不等式
\(w_{i,j}=|s_i-s_j-1-L|^P\),然后满足
\]
这里就不证明了,因为证明需要用到求导。
感谢理解的话可以发现因为有个\(abs\),所以对于一个决策来说是先下后上,而且两个决策最多只有一个交点。
所以有决策单调性,我们用单调队列维护一个该决策和它的下一个决策的交换点\(k_i\),然后每次判断新加入的点与队尾的前一个的交换点是否会代替掉队尾即可。
求交换点的话用二分就好了。
时间复杂度\(O(Tn\log n)\)
怕转移太大可以用\(long\ double\)存,因为如果很大的时候精度就不需要管了,我们只需要知道它是否超过\(1e18\)就好了。
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long double
using namespace std;
const int N=1e5+10;
int T,n,L,P,p[N],k[N],q[N];
ll f[N],s[N];
char st[N][31];
ll power(ll x,int b){
ll ans=1;
while(b){
if(b&1)ans=ans*x;
x=x*x;b>>=1;
}
return ans;
}
ll calc(int j,int i)
{return f[j]+power(fabs(s[i]-s[j]-1-L),P);}
int bound(int i,int j){
int l=i,r=n;
while(l<=r){
int mid=(l+r)>>1;
if(calc(i,mid)<calc(j,mid))l=mid+1;
else r=mid-1;
}
return l;
}
void print(int n){
if(!n)return;print(p[n]);
for(int i=p[n]+1;i<n;i++)
printf("%s ",st[i]);
puts(st[n]);
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&L,&P);
for(int i=1;i<=n;i++){
scanf("%s",st[i]);
s[i]=s[i-1]+strlen(st[i])+1;
}
int head=1,tail=1;q[1]=0;
for(int i=1;i<=n;i++){
while(head<tail&&k[head]<=i)head++;
f[i]=calc(q[head],i);p[i]=q[head];
while(head<tail&&k[tail-1]>=bound(q[tail],i))tail--;
k[tail]=bound(q[tail],i);q[++tail]=i;
}
if(f[n]>1e18)puts("Too hard to arrange");
else printf("%lld\n",(long long)f[n]),print(n);
puts("--------------------");
}
return 0;
}
P1912-[NOI2009]诗人小G【四边形不等式,单调队列】的更多相关文章
- P1912 [NOI2009]诗人小G
P1912 [NOI2009]诗人小G 思路: 平行四边形不等式优化dp 因为f(j, i) = abs(sum[i]-sum[j]+i-j-1-l)^p 满足平行四边形不等式 j < i f( ...
- 不失一般性和快捷性地判定决策单调(洛谷P1912 [NOI2009]诗人小G)(动态规划,决策单调性,单调队列)
洛谷题目传送门 闲话 看完洛谷larryzhong巨佬的题解,蒟蒻一脸懵逼 如果哪年NOI(放心我这样的蒟蒻是去不了的)又来个决策单调性优化DP,那蒟蒻是不是会看都看不出来直接爆\(0\)?! 还是要 ...
- P1912 [NOI2009]诗人小G[决策单调性优化]
地址 n个数划分若干段,给定$L$,$p$,每段代价为$|sum_i-sum_j-1-L|^p$,求总代价最小. 正常的dp决策单调性优化题目.不知道为什么luogu给了个黑题难度.$f[i]$表示最 ...
- [NOI2009]诗人小G 四边形优化DP
题目传送门 f[i] = min(f[j] + val(i,j); 其中val(i,j) 满足 四边形dp策略. 代码: #include<bits/stdc++.h> using nam ...
- 洛谷P1912 [NOI2009]诗人小G(决策单调性)
传送门 题解 决策单调性是个啥……导函数是个啥……这题解讲的是啥……我是个啥…… //minamoto #include<iostream> #include<cstdio> ...
- 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 ...
- [NOI2009]诗人小G --- DP + 决策单调性
[NOI2009]诗人小G 题目描述: 小G是一个出色的诗人,经常作诗自娱自乐. 但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并 ...
- LG1912 [NOI2009]诗人小G
题意 题目描述 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以 ...
- [NOI2009] 诗人小G [题解]
诗人小G 题目大意 给出 \(n\) 个长度不超过 \(30\) 的句子,要求你对其进行排版. 对于每一行,有一个规定的行标准长度 \(L\) ,每一行的不协调度等于该行的实际长度与行标准长度差的绝对 ...
随机推荐
- 旧手机改造成web服务器并实现内网穿透
前几天由于gitee的审核引擎一通乱杀,使得gitee pages停止提供服务,心生更换服务器或者其他pages托管的想法,看了看价格感人的云服务器以及空空的钱包,这时,脑子有个奇怪的想法飘过,自己搞 ...
- ManagementEventWatcher throws ManagementException with call to Stop()
参考网址:https://stackoverflow.com/questions/46100105/managementeventwatcher-throws-managementexception- ...
- 【java虚拟机】常用的jvm配置参数
转自:https://www.cnblogs.com/pony1223/p/8661219.html 零.在IDE的后台打印GC日志: 既然学习JVM,阅读GC日志是处理Java虚拟机内存问题的基础技 ...
- MongoDB - 文档之间的关系 + _sort和投影
1. 文档对象之间的关系 一对一 (one TO one) - 例如: 夫妻 (一个丈夫 对应 一个妻子) - 在MongoDB中, 可以通过内嵌文档的形式来体现出一对一的关系 演示: 首先在 my_ ...
- 最全华为鸿蒙 HarmonyOS 开发资料汇总
开发 本示例基于 OpenHarmony 下的 JavaScript UI 框架,进行项目目录解读,JS FA.常用和自定义组件.用户交互.JS 动画的实现,通过本示例可以基本了解和学习到 JavaS ...
- springcloud<seata配置文件解释及其说明>
出现如下错误时: Could not found property service.disableGlobalTransaction, try to use default value instead ...
- MySQL-表迁移工具的选型-xtrabackup的使用
1.1. 场景 有的时候test人员可能需要在测试库上比较新的数据,这时候只能是从生产库上面去那了.如果是小表还好实用mysqldump/mysqlpump就可以轻松的解决.但是,如果遇到了大表这将是 ...
- LVS实现(VS/DR)负载均衡和Keepalived高可用
LVS是Linux Virtual Server的简写即Linux虚拟服务器,是一个虚拟的服务器集群系统一组服务器通过高速的局域网或者地理分布的广域网相互连接,在它们的前端有一个负载调度器(Load ...
- vue2.0与3.0中的provide和inject 用法
1.provide/inject有什么用? 常用的父子组件通信方式都是父组件绑定要传递给子组件的数据,子组件通过props属性接收,一旦组件层级变多时,采用这种方式一级一级传递值非常麻烦,而且代码可读 ...
- NOIP模拟26「神炎皇·降雷皇·幻魔皇」
T1:神炎皇 又是数学题,气死,根本不会. 首先考虑式子\(a+b=ab\),我们取\(a\)与\(b\)的\(gcd\):\(d\),那么式子就可以改写成: \[(a'+b')*d=a'b' ...