Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超过1018,则输出"Too hard to arrange"(不包含引号).每个输出后面加"--------------------" Sample Input 4 4 9 3 brysj, hhrhl. yqqlm, gsycl. 4 9 2 brysj, hhrhl. yqqlm, gsycl. 1 1005 6 poet…
[BZOJ 1563] [NOI 2009] 诗人小G(决策单调性) 题面 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的.小 G 给每首诗定义了一个行标准长度(行的长度为一行中符号的总个数),他希望排版后每行的长度都和行标准长度相差不远.显然排版时,不应改变原有的句子顺序,并且小 G 不允许把一个句子分在两行或者更多的行内.在满足上面两个条件的情况下,小 G 对于排版中的每行定义了一个不协调度, 为这行的实际长度与行标准长度…
目录 题目链接 题解 代码 题目链接 bzoj1563: [NOI2009]诗人小G 题解 \(n^2\) 的dp长这样 \(f_i = min(f_j + (sum_i - sum_j - 1 - L)^P)\) 设\(w_{ij} = (sum_i - sum_j - 1 - L)^P\) 那么化成1D1D的标准形式 $ f_i = min(f_j + w_{i,j}) $ 发现w满足四边形不等式 证明可以看这里 https://www.byvoid.com/zhs/blog/noi-200…
题意 题目链接 Sol 很显然的一个dp方程 \(f_i = min(f_j + (sum_i - sum_j - 1 - L)^P)\) 其中\(sum_i = \sum_{j = 1}^i len_j + 1\) 这个东西显然是有决策单调性的. 单调队列优化一下 我好像已经做过三个这种类型的题了,而且转移的时候\(w\)中总是带个幂函数..interesting #include<bits/stdc++.h> #define chmax(a, b) (a = (a > b ? a :…
第一次写这种二分来优化决策单调性的问题.... 调了好久,,,各种细节问题 显然有DP方程: $f[i]=min(f[j] + qpow(abs(sum[i] - sum[j] - L - 1)));$ 其中f[i]代表到了第i个句子的最小答案 qpow用于处理^p sum为前缀和 (同时为了处理句子之间的空格问题,我们在统计前缀和的时候就默认在句子后面加一个空格, 然后在计算的时候,由于每一行只有最后一个不用加空格,直接减掉这个多加的空格即可获得正确长度) 首先我们可以打表发现是满足决策单调性…
地址 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-su…
模板题. 每个决策点都有一个作用区间,后来的决策点可能会比先前的优.于是对于每个决策点二分到它会比谁在什么时候更优,得到新的决策点集合与区间. #include<cstdio> #include<algorithm> #include<cstring> #define rep(i,l,r) for (int i=(l); i<=(r); i++) typedef long double ll; using namespace std; ; const ll MAX…
BZOJ_1563_[NOI2009]诗人小G_决策单调性 Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超过1018,则输出"Too hard to arrange"(不包含引号).每个输出后面加"--------------------" Sample Input 4 4 9 3 brysj, hhrhl. yqqlm, gsycl. 4 9 2 brysj, hhrhl…
bzoj1563 思路 首先考虑\(n^2\)的暴力dp,用sum[i]表示前i句话的长度总和.f[i]表示前i句话最小的不协调度之和.转移的时候考虑枚举前面的每个点,找到转移的最优秀的那个点. 然后优化这个暴力.用一个队列存下当前个点之后的点中,哪个区间是从当前点转移更优秀(称为这个点的控制范围).然后如果当前枚举的位置已经超过队首控制范围.那么队首就可以弹出了.加入新点时,如果队尾控制范围的最左侧也是从当前点转移更优秀,那么队尾就可以弹出了.然后二分当前点与队尾点控制范围的分界点.并且将当前…
题目传送门 f[i] = min(f[j] + val(i,j); 其中val(i,j) 满足 四边形dp策略. 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); #define LL long long #defin…