线段树优化 dp 学习笔记

news/2025/1/8 0:22:37/文章来源:https://www.cnblogs.com/Eous/p/18656285

到底是什么算法让我觉得两道题就足以让我写一篇学习笔记呢?

虽然两年半以前写过一道dp,正解的优化是单调队列,但是我拿线段树过了(卡着空间过的),所以那个dp并不能叫线段树优化dp。

CF115E Linear Kingdom Races

这个算是最 “原汁原味” 线段树优化dp。
\(dp_{i,j}\) 表示第 \(j\) 条路到第 \(i\) 条路全修的最大收益。(至于第 \(1\)\(j - 1\) 条路,那不是我们该考虑的,这就是dp的精髓)那么有转移:

\[dp_{i,j} = \begin{cases} dp_{i - 1,j} + (\sum\limits_{l_{k} \ge j,r_{k} = i}p_{k}) - c_{i} & j < i \\ (\max\limits_{1 \le y \le x < i}dp_{x,y}) + (\sum\limits_{l_{k} = r_{k} = i}p_{k}) - c_{i} & j = i \\ \end{cases} \]

其中:\(\sum\limits_{l_{k} \ge j,r_{k} = i}p_{k}\)\(\sum\limits_{l_{k} = r_{k} = i}p_{k}\) 分别表示右端点在 \(i\) 且被区间 \([i,j]\) 覆盖的的比赛收益之和 和 左端点和右端点都在 \(i\) 的比赛收益之和。
那为何在 \(j < i\) 时只用考虑 \(l_{k} \ge j,r_{k} = i\) 的比赛呢?因为 \(r_{k} < i\) 的比赛都在 \(dp_{i - 1,?}\) 考虑过了,而 \(r_{k} > i\) 的不是现在该考虑的。
但是,这题不可能这么简单,单是存状态和枚举状态就可以让我们爆炸了
先来优化空间:我们发现:\(\max\limits_{1 \le y \le x < i}dp_{x,y}\) 就是对于 \(i - 1\) 的答案,于是第二个方程就可以表示成 \(ans + (\sum\limits_{l_{k} = r_{k} = i}p_{k}) - c_{i}\) 。而我们发现第一个方程又只会从 \(i - 1\) 来转移,那么我们可以考虑什么?滚动数组啊。那么空间就优化完了。
现在来优化时间。我们设每一个 \(dp_{i,j}\) 都有一个待定值数组 \(tmp\) ,那么 \(dp_{i,j}\) 一定由 \(tmp\) 里的某一个值转移而来。对于暴力来说,就是每次新枚举一个新的状态,都给他一个新的 \(tmp\) 数组,但是我们要优化,我们就不可能每次用 \(\mathcal{O}(n)\) 给他一个新的 \(tmp\) 数组,我们应该继承上一个状态的 \(tmp\) 数组,并操作它使它变成当前状态的 \(tmp\) 数组。我们发现,每次转移,\(tmp\) 数组的 \([1,i]\) 项都会加上 \(c_{i}\) ,也会加上 \(\sum\limits_{l_{k} \ge j,r_{k} = i}p_{k}\) 。这不就是区间操作吗?我们就可以用线段树来维护这个值。线段树里装的就是待定值数组 \(tmp\) 。而对于 \(i = j\) 的情况,因为本来只有 \([1,i - 1]\) 的下标里有值,而我们要用到 \(tmp_{i}\) 的值,我们就可以给他赋值一个 \(ans\) ,正如同方程里的一样,而题目里让我们求最大的收益,那么线段树查询的就是区间 \([1,i]\) 里的最大值。这样,我们就做完了。
有些细节比如如何记录 \(r_{k} = i\) 的比赛会在代码里说明。

#include<bits/extc++.h>
#define int long long
#define ls (rt << 1)
#define rs (rt << 1 | 1)
using namespace std;
const int maxn = 2e5 + 5;
int n,m;
int a[maxn];
struct edge
{int l,p;edge *nxt;
}*head[maxn];
struct Nahida//不要关心这个名字
{int l,r;int val,lazy;
}tree[maxn << 2];
void push_up(int rt){tree[rt].val = max(tree[ls].val,tree[rs].val);}
void push_down(int rt)
{if (!tree[rt].lazy)return;tree[ls].val += tree[rt].lazy;tree[rs].val += tree[rt].lazy;tree[ls].lazy += tree[rt].lazy;tree[rs].lazy += tree[rt].lazy;tree[rt].lazy = 0;
}
void build(int l,int r,int rt)
{tree[rt].l = l;tree[rt].r = r;if (l == r){tree[rt].val = tree[rt].lazy = 0;return;}int mid = (l + r) >> 1;build(l,mid,ls);build(mid + 1,r,rs);
}
void upd(int ql,int qr,int x,int rt = 1)
{int l = tree[rt].l;int r = tree[rt].r;if (ql <= l && r <= qr){tree[rt].val += x;tree[rt].lazy += x;return;}push_down(rt);int mid = (l + r) >> 1;if (ql <= mid)upd(ql,qr,x,ls);if (qr > mid)upd(ql,qr,x,rs);push_up(rt);
}
void adde(int l,int r,int p)
{auto tmp = new edge;tmp->l = l;tmp->p = p;tmp->nxt = head[r];head[r] = tmp;
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> m;for (int i = 1; i <= n; i++)cin >> a[i];int l,r,p;for (int i = 1; i <= m; i++){cin >> l >> r >> p;adde(l,r,p);//用链式前向星(邻接表)记录右端点为i的比赛。}build(1,n,1);int ans = 0;for (int i = 1; i <= n; i++)//滚动数组滚掉一维,就可以存下了。{//这里没有重新建树就是继承了上一个的tmp数组upd(i,i,ans);//单点修改,增添一个ansupd(1,i,-a[i]);//上面说的:区间更改for (auto j = head[i]; j; j = j->nxt)upd(1,j->l,j->p);//也是区间修改ans = max(ans,tree[1].val);//记录答案}cout << ans;return 0;
}

好题推荐:

P2605 基站选址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/865039.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于自抗扰控制器和线性误差反馈控制律(ADRC-LSEF)的控制系统simulink建模与仿真

1.课题概述 基于自抗扰控制器和线性误差反馈控制律(ADRC-LSEF)的控制系统simulink建模与仿真。2.系统仿真结果 3.核心程序与模型 版本:MATLAB2022a 4.系统原理简介自抗扰控制器(Active Disturbance Rejection Controller, ADRC)结合线性误差反馈控制律(Linear Error Feedback…

MediaWIKI 1.43 教程系列 4 — MediaWIKI 安装后的基本配置

1. 更改logo 将自己的logo 导入到 Mediawiki 的安装目录,即 /var/www/mediawiki/里面的 /resources/assets 然后修改 LocalSettings.php 文件内容,更改如下$wgLogos = [1x => "$wgResourceBasePath/resources/assets/mediawiki.png",icon => "$wgReso…

在iStoreOS上配置frpc客户端

摘自:https://www.koolcenter.com/posts/224 安装frpc,直接在iStoreOS商店找到全部软件。输入名称点新增:填写ip地址以及端口:web 配置看图:

中考英语优秀范文-010 The Spring Festival 春节

1 写作要求 近年来我国的发展世人瞩目,中国的传统文化正越来越受到各国朋友的关注。请根据提示,以 “The Spring Festival” 为题写一篇短文,向外国朋友介绍我国的春节。 要求: 1、字迹工整,规范; 2、 80词左右。 2 优秀范文 The Spring Festival In China, the Spring f…

FANUC机器人M-410iB/700电机断轴维修方法

发那科(FANUC)作为电机领域的领袖品牌,其伺服电机广泛应用于各种工业设备中,特别是在机床、自动化控制、机器人等领域。然而,即使是如此高品质的伺服电机,也难免会出现FANUC工业机械手电机故障,其中断轴故障是比较常见的一种。 一、法兰克机械手电机断轴故障原因分析 1.…

第四章 保护模式入门

本文是对《操作系统真象还原》第四章学习的笔记,欢迎大家一起交流。第四章 保护模式入门 本文是对《操作系统真象还原》第四章学习的笔记,欢迎大家一起交流。 知识部分 为什么要有保护模式? 实模式下安全问题:实模式下操作系统和用户程序属于同一特权级,平起平坐,没有区别…

FMC子卡设计原理图:FMC228-四路1.2Gsps 16bit DA FMC子卡

FMC子卡 , 高性能异构计算卡 , 雷达图像处理 , 模拟信号采集板卡 , 模拟信号输入FMC228-四路1.2Gsps 16bit DA FMC子卡 一、板卡概述FMC228 板卡可实现宽波段、四通道、16位、1.2Gsps(600Msps直接射频综合)DAC功能,时钟可采用内部时钟源(可选择锁定到外部参考),或外部提供…

FMC子卡设计原理图:165-2路万兆光纤SFP+ FMC子卡模块

2路万兆光纤SFP+ FMC子卡模块1. 概述  该板卡是基于kc705和ml605的fmc 10g万兆光纤扩展板设计。  SFP+(10 Gigabit Small Form Factor Pluggable)是一种可热插拔的,独立于通信协议的光学收发器,通常传输光的波长是 850nm, 1310nm 或1550nm,用于10G bps的SONET/SDH,光…

FMC子卡设计方案:127-4通道 12bit 125Msps 直流耦合 AD FMC 子卡

DA输出子卡 , FMC 子卡 , 中低频信号采集 , 模拟信号输入 , FL9627模块4通道 12bit 125Msps 直流耦合 AD FMC 子卡一、板卡概述:FMC 高速 AD 模块 FL9627 为 4 路 125MSPS, 12 位的模拟信号转数字信号模块。 FMC 模块的 AD 转换采用了 2 片 ADI 公司的 AD9627 芯片,每个 AD9…

跨时区协作:娱乐公司团队的全球化利器!

在线文档协作工具如何提升娱乐公司团队的创意效率? 在娱乐行业,创意是核心竞争力。无论是剧本创作、音乐制作,还是影视后期,团队协作的效率直接决定了项目的成败。而在线文档协作工具,正是提升这一效率的利器。今天,我们就从一个具体的点来发散——“实时协作”,看看它如…

tableau连接不上mysql或不显示mysql表的终极解决方法.220301

【报错一】连不上mysql An error occurred while communicating with MySQL The connection to the data source might have been lost. Error Code: 2868C972 The protocol is disconnected! Unable to connect to the MySQL server "*****". Check that the server…

Excel使用IF{1,0}虚拟数组+VLOOKUP实现联合查询.220507

以此案例举例:使用IF({1,0})建立虚拟数据的方法,整体输入的公式是: =VLOOKUP(E2&F2,IF({1,0},A:A&B:B,C:C),2,0) 输入完公式之后,需要按CTRL+shift+enter键 使用if({1,0},A:A&B:B,C:C)来构建了一个不需要辅助列的虚拟数组。 Excel 中ctrl+enter和ctrl+shift+en…