P1912 [NOI2009]诗人小G[决策单调性优化]
n个数划分若干段,给定$L$,$p$,每段代价为$|sum_i-sum_j-1-L|^p$,求总代价最小。
正常的dp决策单调性优化题目。不知道为什么luogu给了个黑题难度。$f[i]$表示最小代价。然后有个正常的dp方程。
$f[i]=min \{ f[j]+|sum_i-sum_j-1-L|^p \} $
然后观察发现带高次项,不好斜率优化或单调队列,考虑有没有决策单调性。本来是可以打表证明的,然后拍一下。然而我杠一波瞎证了一下单调性。
$证明:$
$已知f[j]+|sum_i-sum_j-1-L|^p < f[j']+|sum_i-sum_{j'}-1-L|^p$
$要证f[j]+|sum_i-sum_j-L|^p < f[j']+|sum_i-sum_{j'}-L|^p (j'<j)(就是i加了1)$
$即证|sum_i-sum_{j'}-1-L|^p+|sum_i-sum_j-L|^p < |sum_i-sum_j-1-L|^p+|sum_i-sum_{j'}-L|^p$
$即|sum_i-sum_{j'}-1-L|^p-|sum_i-sum_{j'}-L|^p < |sum_i-sum_j-1-L|^p-|sum_i-sum_j-L|^p$
$然后把其看成关于j的函数,或者就把S_i-S_j-L看成x简便一些,j增大,S_j增大,x总的减小。下面看单调性。可能证的不太严谨,有问题还望指教。$
$f(x)=|x-1|^p-|x|^p (p为大于2正整数)$
$①p为偶数,则f(x)=(x-1)^p-x^p$
$f'(x)=p(x-1)^{p-1}-px^{p-1}$
$x>=1时显然小于0,此段单调减$
$0<=x<1时p(x-1)^{p-1}<px^{p-1}即p(x-1)^{p-1}-px^{p-1}<0,此段单调减$
$x<0时也有上述关系。$
$又因为x∈R内函数值是连续(就是几个转折点值在左右边两个范围内算出来的f都一样的)的,所以整个是一直单调减的。$
$②p为奇数,p-1为偶,则$
$x>=1时f'(x)=p(x-1)^{p-1}-px^{p-1}<0单调减$
$0<=x<1时f(x)=(1-x)^p-x^p,则f'(x)=-p(x-1)^{p-1}-px^{p-1}<0因为偶数次方必定大于0嘛$
$x<0$时$f(x)=(1-x)^p+x^p,f'(x)=-p(x-1)^{p-1}+px^{p-1}$
$∵x-1<x<0$
$∴(x-1)^{p-1}>x^{p-1}$
$∴f'(x)=-p(x-1)^{p-1}+px^{p-1}<0$
$综上,p为奇或偶都有导数小于0,f随x单调减,j增大,S_j增大,x减小,f必然增大,则原不等式得证。$
$所以满足决策单调性。$
$证毕。$
好像有漏洞?算了不管了。
然后随便写写模板就行啦。
注意一下要用long double精度/范围大,不然long long会爆。注意反而不要考虑会不会爆,考虑你就错了。具体见calc函数。
错误×1:怕calc爆掉,加了特判,忽视了因此会导致的队列弹出时会提前结束。
中二气息的结构体不用管。。
#include<bits/stdc++.h>
#define dbg(x) cerr<<#x<<"="<<x<<endl
using namespace std;
typedef long double ll;
typedef double db;
template<typename T>inline char MIN(T&A,T B){return A>B?A=B,:;}
template<typename T>inline char MAX(T&A,T B){return A<B?A=B,:;}
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
inline ll fpow(ll x,int p){ll ret=;for(;p;p>>=,x=x*x)if(p&)ret=ret*x;return ret;}//快速幂都不会写了。。
inline int Abs(int x){return x>?x:-x;}
const int N=+;ll INF=1e18;
struct izayoi_sakuya{
int l,r,pos;
izayoi_sakuya(int l0=,int r0=,int pos0=):l(l0),r(r0),pos(pos0){}
}q[N];
char s[N][];
ll f[N],lim;
int sum[N],pre[N];
int T,L,p,n,l,r;
inline ll calc(int j,int i){return f[j]+fpow(Abs(sum[i]-sum[j]--L),p);}
/*这是原来的
inline ll calc(int j,int i){
ll x=Abs(sum[i]-sum[j]-1-L);
if(x>lim)return INF+1;
ll po=fpow(x,p);
if(f[j]>(ll)1e18-po)return INF+1;
return f[j]+po;
}
*/
inline int find_pos(int L,int R,int j,int i){
int mid;
while(L<R){
mid=L+R>>;
if(calc(j,mid)>=calc(i,mid))R=mid;
else L=mid+;
}
return R;
}
inline void dp(){
q[l=r=]=izayoi_sakuya(,n,);
for(register int i=;i<=n;++i){
f[i]=calc(q[l].pos,i);pre[i]=q[l].pos;//dbg(i),dbg(f[i]),dbg(sum[i]);
if(i==q[l].r)++l;else ++q[l].l;
if(f[i]>INF)continue;
while(l<=r&&calc(q[r].pos,q[r].l)>=calc(i,q[r].l))--r;
if(r<l)q[r=l]=izayoi_sakuya(i+,n,i);
else{
int k;if(calc(q[r].pos,q[r].r)<=calc(i,q[r].r))k=q[r].r+;
else k=find_pos(q[r].l,q[r].r,q[r].pos,i);//dbg(i),dbg(k);
if(k<=n)q[r].r=k-,q[++r]=izayoi_sakuya(k,n,i);
}
}
}
inline void print(int x,int y){
if(x)print(pre[x],x);
for(register int i=x+;i<=y;++i)printf("%s",s[i]),i==y?putchar('\n'):putchar(' ');
} int main(){//freopen("test.in","r",stdin);freopen("tmp.out","w",stdout);
read(T);while(T--){
read(n),read(L),read(p);lim=(ll)ceil(pow(1e18,1.0/(db)p));
for(register int i=;i<=n;++i)scanf("%s",s[i]),sum[i]=sum[i-]+strlen(s[i])+;
dp();if(f[n]>INF)printf("Too hard to arrange\n");
else printf("%lld\n",(long long)f[n]),print(pre[n],n);
printf("--------------------\n");
}
return ;
}
P1912 [NOI2009]诗人小G[决策单调性优化]的更多相关文章
- [NOI2009]诗人小G 决策单调性优化DP
第一次写这种二分来优化决策单调性的问题.... 调了好久,,,各种细节问题 显然有DP方程: $f[i]=min(f[j] + qpow(abs(sum[i] - sum[j] - L - 1))); ...
- [BZOJ1563][NOI2009]诗人小G(决策单调性优化DP)
模板题. 每个决策点都有一个作用区间,后来的决策点可能会比先前的优.于是对于每个决策点二分到它会比谁在什么时候更优,得到新的决策点集合与区间. #include<cstdio> #incl ...
- bzoj1563: [NOI2009]诗人小G 决策单调性(1D1D)
目录 题目链接 题解 代码 题目链接 bzoj1563: [NOI2009]诗人小G 题解 \(n^2\) 的dp长这样 \(f_i = min(f_j + (sum_i - sum_j - 1 - ...
- BZOJ1563: [NOI2009]诗人小G(决策单调性 前缀和 dp)
题意 题目链接 Sol 很显然的一个dp方程 \(f_i = min(f_j + (sum_i - sum_j - 1 - L)^P)\) 其中\(sum_i = \sum_{j = 1}^i len ...
- BZOJ1563:[NOI2009]诗人小G(决策单调性DP)
Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超过1018,则输出"Too hard to arr ...
- P1912 [NOI2009]诗人小G
P1912 [NOI2009]诗人小G 思路: 平行四边形不等式优化dp 因为f(j, i) = abs(sum[i]-sum[j]+i-j-1-l)^p 满足平行四边形不等式 j < i f( ...
- [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性)
[BZOJ 1563] [NOI 2009] 诗人小G(决策单调性) 题面 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的.小 G ...
- BZOJ_1563_[NOI2009]诗人小G_决策单调性
BZOJ_1563_[NOI2009]诗人小G_决策单调性 Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超 ...
- 不失一般性和快捷性地判定决策单调(洛谷P1912 [NOI2009]诗人小G)(动态规划,决策单调性,单调队列)
洛谷题目传送门 闲话 看完洛谷larryzhong巨佬的题解,蒟蒻一脸懵逼 如果哪年NOI(放心我这样的蒟蒻是去不了的)又来个决策单调性优化DP,那蒟蒻是不是会看都看不出来直接爆\(0\)?! 还是要 ...
随机推荐
- the Determine in June
今天是6月10号,周三. 自己做的CSDN博客端(仿小巫博客,ps:里边的框架和代码优化都是自己又一次用新框架做的或者自己又一次实现)也已经有三天了.进度还差非常多--- 结合了上次投简历的经验和期末 ...
- tf树
tf变换(1) TF库的目的是实现系统中任一个点在所有坐标系之间的坐标变换,也就是说,只要给定一个坐标系下的一个点的坐标,就能获得这个点在其他坐标系的坐标. 使用tf功能包,a. 监听tf变换: ...
- iOSPOI检索详细总结
iOS百度地图路径规划和POI检索详细总结 路径规划.png 百度地图的使用 百度地图API的导入网上说了许多坑,不过我遇到的比较少,这里就放两个比较常见的吧.坑一: 奥联WIFI_xcodeproj ...
- 利用python进行数据分析之pandas入门
转自https://zhuanlan.zhihu.com/p/26100976 目录: 5.1 pandas 的数据结构介绍5.1.1 Series5.1.2 DataFrame5.1.3索引对象5. ...
- struts2的分页标签
1.准备tld文件 <?xml version="1.0" encoding="UTF-8" standalone="no"?> ...
- Java 内存分配全面浅析(转)
本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...
- BCH分叉是一次站队博弈
BCH分叉在即,很多人说BCH本次分叉实质是大佬间的斗争,主要是本次BCH分叉主要分为两大派别: 一派以BCH用户量最大的客户端Bitcoin ABC开发组为主,要在11月15日展开硬分叉升级,主要升 ...
- oracle-jforum论坛链接Oracle
问题描述 jforum论坛链接Oracle jforum论坛链接Oracle数据库 论坛主题页面不显示 是权限引起的吗 解决方案 页面不显示,你需要看一下错误,估计是配置不对引起的 参考一下这个 jf ...
- Nodejs 中常见的加密算法:RSA(1)
Linux用户(以Ubuntu为例) $ openssl 进入OpenSSL程序 OpenSSL> genrsa -out rsa_private_key.pem 1024 生成私钥 OpenS ...
- Java基础教程:对象比较排序
Java基础教程:对象比较排序 转载请标明出处:http://blog.csdn.net/wangtaocsdn/article/details/71500500 有时候需要对对象列表或数组进行排序, ...