P8592 『JROI-8』颅脑损伤 2.0(加强版)(线性 dp + 单调队列优化)

news/2024/10/6 3:36:48/文章来源:https://www.cnblogs.com/FireRaku/p/18285809

P8592 『JROI-8』颅脑损伤 2.0(加强版)

线性 dp + 单调队列优化

最优化问题,考虑 dp。先离散化,按左端点排序,设 \(f_i\) 表示考虑完前 \(i\) 条线段符合条件的染色,最小长度和。转移枚举上一条红色线段 \(j\)\(f_i=f_j+len_i\)。当然 \(j\) 需要满足题目的条件,即 \((j,i)\) 中的黑色线段要么与 \(i\) 有交,要么与 \(j\) 有交。

条件可以写成,对于 \(r_k<l_i\) 的线段,一定有 \(r_k\le r_j\),也就是 \(\max(r_k)\le l_j\)

\(b_{r_j}=l_j\),那么 \(\max(r_k)\) 就是 \(b\) 序列上一段前缀 \(\max\),可以预处理 \(g_i=\max\limits_{j\le i}b_j\)

重写一下状态转移方程:

\[f_i=\max\limits_{g_{l_i}\le r_j<l_i} f_j+len_i \]

复杂度 \(O(n^2)\)

发现 \(l_i\) 单调递增,\(g_{l_i}\) 只与 \(l_i\),所以前缀 \(\max\) 也单调递增,那么转移位置就是一段不断向右的区间,单调队列优化到 \(O(n)\)

注意单调队列的写法,每次查询都要先把 \(<l_i\) 的位置插入一遍。为了方便,也修改了状态下标的意义,具体看代码。

复杂度 \(O(n\log n)\),瓶颈是离散化,但可以用基数排序做到 \(\Theta(n)\)

#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define mk std::make_pair
#define fi first
#define se second
#define pb push_backusing i64 = long long;
using ull = unsigned long long;
const i64 iinf = 0x3f3f3f3f, linf = 0x3f3f3f3f3f3f3f3f;
const int N = 5e5 + 10;
int n;
struct node {i64 l, r, len;friend bool operator < (node a, node b) {return a.l < b.l;}
} a[N];
i64 b[N << 1], g[N << 1], f[N << 1], q[N << 1], pos[N << 1];
int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cin >> n;for (int i = 1; i <= n; i++) {std::cin >> a[i].l >> a[i].r;b[i] = a[i].l, b[i + n] = a[i].r;a[i].len = a[i].r - a[i].l;}i64 m = (n << 1);std::sort(b + 1, b + m + 1);m = std::unique(b + 1, b + m + 1) - b - 1;for (int i = 1; i <= n; i++) {a[i].l = std::lower_bound(b + 1, b + m + 1, a[i].l) - b;a[i].r = std::lower_bound(b + 1, b + m + 1, a[i].r) - b;}std::sort(a + 1, a + n + 1);for (int i = 1; i <= n; i++) pos[a[i].r] = std::max(pos[a[i].r], a[i].l);for (int i = 1; i <= m; i++) g[i] = std::max(g[i - 1], pos[i]);i64 h = 1, t = 1, nw = 1;memset(f, 0x3f, sizeof(f));f[0] = 0;i64 ans = linf;for (int i = 1; i <= n; i++) {while(nw < a[i].l) {while(h <= t && f[q[t]] >= f[nw]) t--;q[++t] = nw++; }while(h <= t && q[h] < g[a[i].l - 1]) h++;if(h <= t) f[a[i].r] = std::min(f[a[i].r], f[q[h]] + a[i].len);if(a[i].r >= a[n].l) ans = std::min(ans, f[a[i].r]);}std::cout << ans << "\n";return 0;
}

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

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

相关文章

结合RNN与Transformer双重优点,深度解析大语言模型RWKV

RWKV在多语言处理、小说写作、长期记忆保持等方面表现出色,可以主要应用于自然语言处理任务,例如文本分类、命名实体识别、情感分析等。本文分享自华为云社区《【云驻共创】昇思MindSpore技术公开课 RWKV 模型架构深度解析》,作者:Freedom123。 一、前言 Transformer模型作…

VMware vSphere Tanzu部署_16_TKC集群节点VM密码获取

SupervisorControlPlaneVM密码获取 通过SSH方式登录vcentervcenter开启SSH服务通过SSH工具登录vcenter执行获取密码脚本在vcenter shell模式下执行/usr/lib/vmware-wcp/decryptK8Pwd.py命令WARNING! The remote SSH server rejected X11 forwarding request. Connected to serv…

空洞文件

实际上这些数据并没有被存储在磁盘上。当创建一个空洞文件时,文件系统会记录这些“空洞”,但并不会在物理介质上实际分配和保存未使用的空间,从而节省了实际的存储空间。 举例来说,如果你创建一个大小为1GB的空洞文件,其中写入了大量的零字节据,实际上只有少量的数据(例…

Box,一个字典操作python库

Box介绍 Box 是一个让字典操作变得异常简单与直观,支持通过属性访问字典内容的库。特点概述属性访问Box 允许用户像访问对象属性一样访问字典的值,提升了代码的可读性和易用性。无缝嵌套自动将嵌套的字典转换为 Box 对象,使得处理复杂字典结构变得轻而易举。灵活性强支持多种…

(四)JS逆向——中国观鸟网

爬取观鸟网的信息 有sign值,timestamp和requestid,要看这些值是怎么生成的 载荷有加密的数据 返回值也经过加密 搜索requestid,找到了eval加密的代码,通过解密,就能找到生成这些值的代码段 代码格式化后,找到了这几个值的生成位置 requestid的生成是随机值,timestamp是时…

vscode插件安装好用

本文来自博客园,作者:prince11,转载请注明原文链接:https://www.cnblogs.com/prince11/p/18285764

java List子父级集合转List树工具类

java List集合转Tree集合 1.创建泛型工具类package com.demo;import org.springframework.util.CollectionUtils;import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util…

博客屋网址导航自适应主题php源码

博客屋网址导航自适应主题php源码v1.0是一个以PHP+MySQL进行开发的网址导航源码。模板源码后台开源无加密,可二次开发,前端响应式自适应多端屏幕。主题源码适合个人建站技术,个人博客论坛,个人日记分享等个人网站内容。站长也可以修改成其他行业的内容目录导航。演示地址ht…

【vue】为什么v-for中需要一个key呢?

通过key值来区分循环中的子内容

在wsl中部署puppeteer的相关笔记

二. 缺少依赖问题反复提示缺少各种依赖,到处搜刮一顿操作之后是没问题了,但也不知道哪些是无所谓的 apt install -y gconf-service libc6 libcairo2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libstdc++6 libx11-6 apt inst…

《计算机组成与系统结构(第二版) 裘雪红 李伯成 西安电子科技大学出版社》课后习题答案(带解析)(七)

此系列答案配套《计算机组成与系统结构(第二版) 裘雪红 李伯成 西安电子科技大学出版社》一书相关内容。所有内容为博主个人编辑,仅作参考学习交流之用,转载请注明出处。如发现错误,请联系博主及时勘误。如有侵权行为,博主将立即下架全部内容。声明:此系列答案配套《计…

【设计模式(二)】创建型模式--抽象工厂模式

创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。抽象工厂模式也是⼀种创建型设计模式,提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 抽象工厂…