Solution -「HDU 3507」Print Article
Description
Link.
给出 \(N\) 个单词,每个单词有个非负权值 \(C_{i}\),现要将它们分成连续的若干段,每段的代价为此段单词的权值和,还要加一个常数 \(M\),即 \((\sum C_{i})^{2}+M\)。现在想求出一种最优方案,使得总费用之和最小
Solution
设 \(f_{i}\) 表示 \(n=i\) 时的答案,转移方程为:
\]
显然过不了,推成可以斜率优化的形式。
我们假设决策 \(j\) 优于决策 \(k\) 且 \(k<j<i\)。
(一种错误的思路)
\]
\]
\]
\]
\]
\]
\]
\]
最后发现做 \(\text{TM}\) 不出来。
于是重新推:
(另一种错误思路)(我简直自闭)
\]
\]
\]
\]
\]
\]
\]
\]
嗯,还是 \(\text{TM}\) 做不来。
好了,推倒重来。
(这次是对的)
\]
\]
\]
\]
\]
\]
\]
\]
我们令 \(Y_{i}=f_{i}+S_{i}^{2}\),\(X_{i}=2S_{i}\),则我们有:
\]
挺好的,正好就是斜率优化的形式!
斜率优化!
牛逼啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎哎啊啊哎。
那么接下来我们设 \(F(j,k)=\frac{Y_{j}-Y_{k}}{X_{j}-X_{k}}\)。
其中如果满足 \(F(j,k)<S_{i}\),则我们称决策 \(j\) 优于决策 \(k\)。
现在我们继续设 \(k<j<i\),那么如果满足 \(F(i,j)<F(j,k)\),决策 \(j\) 就永远不可能成为最优解。
证明不会,\(\text{PPT}\) 没看懂。
最后放个 \(\text{PPT}\) 里写的 \(\text{Summary}\):
1、用一个单调队列来维护解集。
2、假设队列中从头到尾已经有元素 \(a\),\(b\),\(c\)。那么当 \(d\) 要入队的时候,维护队列的上凸性质,即如果 \(F(d,c)<F(c,b)\),那么删除点 \(c\)。直到找到 \(F(d,x)\ge F(x,y)\) 为止,并将 \(d\) 点加入在该位置中。
3、求解的时候,从对头开始,如果已有元素 \(a\),\(b\),\(c\),当 \(i\) 点要求解时,如果 \(F(b,a)<S_{i}\),说明 \(b\) 点比 \(a\) 点更优,\(a\) 点直接排除,于是 \(a\) 出队,最后 \(f_{i} = \mathrm{getDp}(Q[\mathrm{head}])\)。
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef long long LL;
namespace MySpace
{
template<class _T>
void read(_T &x)
{
x = 0;
char c = getchar();
_T f = 1;
while( c < '0' || c > '9' )
{
if( c == '-' ) f = -1;
if( c == -1 ) exit( 0 );
c = getchar();
}
while( c >= '0' && c <= '9' ) x = x * 10 + c - '0', c = getchar();
x *= f;
}
template<class _T>
void write(_T x)
{
if( x < 0 ) putchar( '-' ), x = -x;
if( x > 9 ) write( x / 10 );
putchar( x % 10 + '0' );
}
const LL MAXN = 5e5 + 5;
LL N, M, Dp[MAXN], Q[MAXN], S[MAXN], A[MAXN];
LL Square( LL x ) { return x * x; }
LL Up( LL i ) { return Dp[i] + Square( S[i] ); }
LL Down( LL i ) { return S[i] << 1; }
LL FracUp( LL j, LL k ) { return Up( j ) - Up( k ); }
LL FracDown( LL j, LL k ) { return Down( j ) - Down( k ); }
}
int main()
{
using namespace MySpace;
while( ~ scanf( "%lld%lld", &N, &M ) )
{
for( LL i = 1; i <= N; ++ i ) scanf( "%lld", &A[i] ), S[i] = S[i - 1] + A[i];
LL l = 1, r = 1;
Q[r] = 0;
for( LL i = 1; i <= N; ++ i )
{
while( l < r && FracUp( Q[l + 1], Q[l] ) < S[i] * FracDown( Q[l + 1], Q[l] ) ) l ++;
Dp[i] = Dp[Q[l]] + Square( S[i] - S[Q[l]] ) + M;
while( l < r && FracUp( i, Q[r] ) * FracDown( Q[r], Q[r - 1] ) <= FracUp( Q[r], Q[r - 1] ) * FracDown( i, Q[r] )) r --;
Q[++ r] = i;
}
printf( "%lld\n", Dp[N] );
}
// while( read( N ), read( M ), 1 )
// {
// for( LL i = 1; i <= N; ++ i ) read( A[i] ), S[i] = S[i - 1] + A[i];
// LL l = 1, r = 0;
// Q[l] = 0;
// for( LL i = 1; i <= N; ++ i )
// {
// while( l <= r && FracUp( Q[l + 1], Q[l] ) < S[i] * FracDown( Q[l + 1], Q[l] ) ) l ++;
// Dp[i] = Dp[Q[l]] + Square( S[i] - S[Q[l]] ) + M;
// while( l <= r && FracUp( i, Q[r - 1] ) * FracDown( Q[r - 1], Q[r - 2] ) < FracUp( Q[r - 1], Q[r - 2] ) * FracDown( i, Q[r - 1] )) r ++;
// Q[++ r] = i;
// }
// write( Dp[N] ), putchar( '\n' );
// }
return 0;
}
Solution -「HDU 3507」Print Article的更多相关文章
- Solution -「HDU 6875」Yajilin
\(\mathcal{Description}\) Link.(HDU 裂开了先放个私链 awa.) 在一个 \(n\times n\) 的方格图中,格子 \((i,j)\) 有权值 \(w_ ...
- Solution -「HDU 5498」Tree
\(\mathcal{Description}\) link. 给定一个 \(n\) 个结点 \(m\) 条边的无向图,\(q\) 次操作每次随机选出一条边.问 \(q\) 条边去重后构成生成 ...
- Solution -「HDU 6643」Ridiculous Netizens
\(\mathcal{Description}\) Link. 给定一棵含有 \(n\) 个结点的树,点 \(u\) 有点权 \(w_u\),求树上非空连通块的数量,使得连通块内点权积 \(\ ...
- Solution -「HDU 1788」CRT again
\(\mathcal{Description}\) Link. 解同余方程组: \[x\equiv m_i-a\pmod{m_i} \] 其中 \(i=1,2,\dots,n\). \ ...
- Solution -「HDU #6566」The Hanged Man
\(\mathcal{Description}\) Link. 给定一棵含 \(n\) 个点的树,每个结点有两个权值 \(a\) 和 \(b\).对于 \(k\in[1,m]\),分别求 \[ ...
- Solution -「ARC 104E」Random LIS
\(\mathcal{Description}\) Link. 给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...
- Solution -「HDU」Professor Ben
Description 有 \(Q\) 个询问.每次给定一个正整数 \(n\),求它的所有因数的质因数个数的和. Solution 就讲中间的一个 Trick. 我们定义正整数 \(x\) 有 \(f ...
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- Solution -「BZOJ 3812」主旋律
\(\mathcal{Description}\) Link. 给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
随机推荐
- selenium4-获取页面元素相关信息
本小节我们简单说下如何使用selenium4-获取页面元素相关信息,以及获取页面元素的相关信息后可以做什么. 获取页面元素的主要目的:(1)执行完步骤后进行断言:(2)获取前一步骤的响应结果作为后续步 ...
- mysql_三大范式
介绍 数据库的三大范式就是数据库的表应该如何设计,应该注意什么. 第一范式 要求每一张表都有一个主键,每一个字段都不可再分. 举例: id username address 1 张三 中国,北京 2 ...
- 解密Prompt系列8. 无需训练让LLM支持超长输入:知识库 & unlimiformer & PCW & NBCE
这一章我们聊聊有哪些方案可以不用微调直接让大模型支持超长文本输入,注意这里主要针对无限输入场景.之前在BERT系列中我们就介绍过稀疏注意力和片段递归的一些长文本建模方案长文本建模 BigBird &a ...
- 国产MCU兆易GD32实现矩阵按键扫描
一.矩阵键盘 为了减少I/O口的占用,通常将按键排列成矩阵形式.在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接.使用8个io口来进行16个按键的控制读取,可以减 ...
- google colab使用体验
复现的TRSSL 的代码似乎是python3.8的,在本地跑电脑带不起来,即时把处理图形数改为1 但是colab用3.8不太好下载包, 因此直接上了3.9 除了一些库没有意外,遇到了一点小问题: Ca ...
- Jmeter学习之七_使用influxdb2.7和grafana10进行Jmeter测试结果展示的方法
Jmeter学习之七_使用influxdb2.7和grafana10进行Jmeter测试结果展示的方法 摘要 前几天验证了 线程组内的-监听器 jp@gc 相关的组件 以及验证了 server-age ...
- 微信小程序 - WXML 模板语法
[黑马程序员前端微信小程序开发教程,微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)] https://www.bilibili.com/video/BV1834y1676 ...
- IoTOS v1.0.0 开源 高效 实用 | 免费商用
IoTOS v1.0.0 一款高效实用 IoTCard 管理 & 运营系统. IoTOS 目前取名范围过大,其主要用于IoTCard 管理业务以高效.健壮.灵活设计 SaaS.多语言.机器人推 ...
- Centos 7安装Docker镜像仓库-Harbor
下载安装包并导入镜像 # 进入文件下载目录 cd /root/software/ # 下载安装文件 # 如果下载失败可以本地下载,下载后上传至服务器,https://github.com/goharb ...
- SSE图像算法优化系列三十一:RGB2HSL/RGB2HSV及HSL2RGB/HSV2RGB的指令集优化-上。
RGB和HSL/HSV颜色空间的相互转换在我们的图像处理中是有着非常广泛的应用的,无论是是图像调节,还是做一些肤色算法,HSL/HSV颜色空间都非常有用,他提供了RGB颜色空间不具有的一些独特的特性, ...