当前位置: 首页 > news >正文

【Luogu_P8118】 「RdOI R3.5」Mystery【Slope Trick】【DP】

P8118 「RdOI R3.5」Mystery

题目描述

给出一个长度为 nnn 的单调不降整数数列 {ai}\{a_i\}{ai} 和一个整数 kkk

我们定义两个长度均为 ppp 的序列 {xi},{yi}\{x_i\},\{y_i\}{xi},{yi} 的「差异度」F(x,y,p)=∑i=1p∣xi−yi∣F(x,y,p)=\sum_{i=1}^p |x_i-y_i|F(x,y,p)=i=1pxiyi

现在对于每个整数 l∈[1,n]l \in [1,n]l[1,n],你都需要构造一个长度为 lll 的序列 {bl,i}\{b_{l,i}\}{bl,i}。满足对于任意 1≤i<l1\le i <l1i<lbl,i+1≥bl,i+kb_{l,i+1}\ge b_{l,i}+kbl,i+1bl,i+k;且 F(a[1⋯l],bl,l)F(a_{[1\cdots l]},b_l,l)F(a[1l],bl,l) 最小。其中 a[1⋯l]a_{[1\cdots l]}a[1l] 表示 {ai}\{a_i\}{ai} 的长度为 lll 的前缀,即 {a1,a2,⋯ ,al}\{a_1,a_2,\cdots,a_l\}{a1,a2,,al}。注意,bl,ib_{l,i}bl,i 没必要是整数。

输入格式

第一行输入两个整数 n,kn,kn,k
第二行输入 nnn 个整数,代表 {ai}\{a_i\}{ai}
第三行输入一个整数 TTT,代表答案输出方式。具体解释请参考「输出格式」。

输出格式

  • T=0T=0T=0,则输出 nnn 个整数,每个整数单独占一行。第 lll 行的整数代表 F(a[1⋯l],bl,l)F(a_{[1\cdots l]},b_l,l)F(a[1l],bl,l)
  • T=1T=1T=1,则你仅需输出一行一个整数,表示 F(a,bn,n)F(a,b_n,n)F(a,bn,n)

输入输出样例 #1

输入 #1

5 2
2 3 4 5 6
0

输出 #1

0
1
2
4
6

输入输出样例 #2

输入 #2

6 2
1 1 4 5 6 8
0

输出 #2

0
2
2
3
4
5

输入输出样例 #3

输入 #3

6 2
1 1 4 5 6 8
1

输出 #3

5

输入输出样例 #4

输入 #4

20 4
4 6 7 9 19 21 30 32 33 35 49 50 58 67 75 77 78 89 91 91
0

输出 #4

0
2
5
10
10
12
12
14
17
22
22
25
25
25
25
27
30
30
32
36

说明/提示

样例解释

样例 #1

如下是一种可能的构造方案:

b1={2}b2={2,4}b3={1,3,5}b4={1,3,5,7}b5={0,2,4,6,8} \begin{aligned} b_1&=\{2\}\\ b_2&=\{2,4\}\\ b_3&=\{1,3,5\}\\ b_4&=\{1,3,5,7\}\\ b_5&=\{0,2,4,6,8\}\\ \end{aligned} b1b2b3b4b5={2}={2,4}={1,3,5}={1,3,5,7}={0,2,4,6,8}

样例 #2

如下是一种可能的构造方案:

b1={1}b2={0,2}b3={0,2,4}b4={0,2,4,6}b5={−1,1,3,5,7}b6={−1,1,3,5,7,9} \begin{aligned} b_1&=\{1\}\\ b_2&=\{0,2\}\\ b_3&=\{0,2,4\}\\ b_4&=\{0,2,4,6\}\\ b_5&=\{-1,1,3,5,7\}\\ b_6&=\{-1,1,3,5,7,9\}\\ \end{aligned} b1b2b3b4b5b6={1}={0,2}={0,2,4}={0,2,4,6}={1,1,3,5,7}={1,1,3,5,7,9}

样例 #3

同样例 #2,只不过 T=1T=1T=1,你只需要输出 F(a,b6,6)=5F(a,b_6,6)=5F(a,b6,6)=5 即可。

数据范围及约定

subtask分值n≤T=k,ai≤subtask 依赖1301000100−230105010613401061106− \def\arraystretch{1.5} \begin{array}{|c|c|c|c|c|c|} \hline \textbf{subtask} & \textbf{分值} & \bm{{n\le}} & \bm{{T=}} & \bm{{k,a_i\le}} & \textbf{subtask 依赖}\cr\hline 1 & 30 & 100 & 0 & 100 & -\cr\hline 2 & 30 & 10^5 & 0 & 10^6 & 1\cr\hline 3 & 40 & 10^6 & 1 & 10^6 & -\cr\hline \end{array} subtask123分值303040n100105106T=001k,ai100106106subtask 依赖1

对于 100%100\%100% 的数据,1≤n≤1061\le n \le 10^61n1061≤k,ai≤1061\le k,a_i\le 10^61k,ai106T∈{0,1}T\in\{0,1\}T{0,1}


思路:

首先了解Slope Trick
本质上是一种一次分段函数的优化。
拿本题来举例(首先容易想到让aia_iai减去i∗ki*kik将题目转化为通过最少次加减1使得序列单调不降),可是设fi,jf_{i,j}fi,j表示到了第iii位为jjj的最少次数。
可得fi,j=min(fi−1,k+∣ai−j∣),1≤k≤jf_{i,j}=min(f_{i-1,k}+|a_i-j|),1\le k\le jfi,j=min(fi1,k+aij)1kj
前缀min优化,可得fi,j=min(fi,j−1,fi−1,j+∣ai−j∣)f_{i,j}=min(f_{i,j-1},f_{i-1,j}+|a_i-j|)fi,j=min(fi,j1,fi1,j+aij)
把它写成函数的形式,即令F(x)=fi,jF(x)=f_{i,j}F(x)=fi,jG(x)=fi−1,jG(x)=f_{i-1,j}G(x)=fi1,jH(x)=∣ai−j∣H(x)=|a_i-j|H(x)=aij
F(x)=G(x)+H(x)F(x)=G(x)+H(x)F(x)=G(x)+H(x)
因为G(x)G(x)G(x)H(x)H(x)H(x)都为一次分段单凹函数,所以F(x)F(x)F(x)也为一次分段单凹函数,那么接下来使用Slope Trick优化
对于一个一次分段凹函数,我们可以将它记录为在拐点处斜率的加减的形式,如
f(x)={−x,x<−1x=1,−1≤x≤1x,x>1f(x)=\left\{ \begin{aligned} {-x,x<-1} \\ {x=1,-1\le x \le 1} \\ {x,x>1} \end{aligned} \right.f(x)=x,x<1x=1,1x1x,x>1
那么它的记录就是-1,1
表示它在x=-1处斜率加1,在x=1处斜率加1。
如果要合并两个函数,就直接将两个函数的记录数组合并就可以了。
对于这个题目,维护一个凹的分段一次函数,且只有维护左半边,并保持函数的斜率最后一定为0,因为对于后半部分斜率上升的对答案不会有任何影响。
考虑当前函数中最后一段的斜率为0的位置tttaia_iai,若t≤ait \le a_itai,则证明aia_iai在当前不需要任何操作,所以贡献为0
ai<ta_i < tai<t,则将其升为ttt,产生t−ait-a_itai的贡献。
然后将H(x)H(x)H(x)加入函数中时,注意如果t≤ait \le a_itai,则只用将H(x)H(x)H(x)的左半部分加入即可,即只用加一次aia_iai,否则加两次。

code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>#define ll long longusing namespace std;const ll MAXN = 1e6 + 5;ll n, k, ans, T;
ll a[MAXN];priority_queue<ll> q;int main() {scanf("%lld%lld", &n, &k);for(ll i = 1; i <= n; i ++) scanf("%lld", &a[i]), a[i] -= i * k;scanf("%lld", &T);for(ll i = 1; i <= n; i ++) {if(i == 1) {q.push(a[i]);if(!T) printf("0\n");continue;}if(a[i] >= q.top()) q.push(a[i]);else {ans += q.top() - a[i];q.push(a[i]), q.push(a[i]), q.pop();}if(!T) printf("%lld\n", ans);}if(T) printf("%lld", ans);return 0;
}

文章转载自:

http://wGoBwg7N.zpjhh.cn
http://EJY6Y3E0.zpjhh.cn
http://3bnb93gx.zpjhh.cn
http://Zx8GSgK2.zpjhh.cn
http://jxB0FVML.zpjhh.cn
http://zppGgBeX.zpjhh.cn
http://uS45yLWD.zpjhh.cn
http://qdEsOMoi.zpjhh.cn
http://MvkIpKDo.zpjhh.cn
http://T9eFgp4h.zpjhh.cn
http://Lcf0PTvf.zpjhh.cn
http://2IA6ggeg.zpjhh.cn
http://d5hER4LA.zpjhh.cn
http://VFSdBLDo.zpjhh.cn
http://XIJvX6P7.zpjhh.cn
http://Lv7ckjPR.zpjhh.cn
http://BIsIIEVY.zpjhh.cn
http://raBDfe6y.zpjhh.cn
http://z8gspIbG.zpjhh.cn
http://Ffle6IPg.zpjhh.cn
http://RiLd8E4i.zpjhh.cn
http://CfYVUiBr.zpjhh.cn
http://Ar8eDVYB.zpjhh.cn
http://HmOqcMkt.zpjhh.cn
http://9D6MrRkq.zpjhh.cn
http://WCoR6OGx.zpjhh.cn
http://XrCbVbx0.zpjhh.cn
http://STledY1u.zpjhh.cn
http://2Q3U7uF5.zpjhh.cn
http://iZPQx998.zpjhh.cn
http://www.dtcms.com/a/370574.html

相关文章:

  • SSH服务远程安全登录
  • cds序列转换为pepperl脚本详细解读及使用
  • 什么时候用no,什么时候用non,什么时候用not?
  • 2025年本体论:公理与规则的挑战与趋势
  • 发布vue项目、nginx配置及问题场景(history)
  • Netty从0到1系列之EventLoop
  • 在Ubuntu上配置Nginx实现开机自启功能
  • 智慧灌区系统:科技赋能,让农田灌溉更智能、更高效、更可持续
  • 第2课:环境搭建:基于DeepSeek API的开发环境配置
  • 本地MOCK
  • 使用Docker安装Stirling-PDF(PDF工具)
  • 交换机详细
  • 综合安防集成系统解决方案,智慧园区,智慧小区安防方案(300页Word方案)
  • Spring Data JPA 对PostgreSQL向量数据的支持
  • 去中心化投票系统开发教程 第二章:开发环境搭建
  • BOSS直聘招聘端自动化识别策略调整(20250905)
  • MySQL--索引和事务
  • c++之基础B(双重循环)(第五课)
  • 3、工厂模式
  • 2025高教社国赛数学建模竞赛B题完整参考论文(含模型和代码)
  • MCP Token超限问题解决方案
  • 并行编程实战——CUDA编程的纹理内存
  • 京东商品评论API开发指南
  • Day27 函数2 装饰器
  • YOLOv8支持旋转框检测(OBB)任务随记
  • 解决VMWare网络适配器的桥接模式 ping 重复数据包DUP问题
  • Elasticsearch优化从入门到精通
  • 【开题答辩全过程】以电商数据可视化系统为例,包含答辩的问题和答案
  • 大模型热潮中的“连接器”:深入解析模型上下文协议 (MCP)
  • Java学习笔记二(类)