线段树优化建图学习笔记

线段树优化建图 以此更新每个强连通分量所能引爆炸弹的最左边和最右边即可。考虑到每个炸弹所能引爆的炸弹都是一个。可以想到将每一个炸弹转化成一个点,把每个炸弹和它能够引爆的炸弹之间连一条有向边。,可以用线段树优化建图。至于找到每个炸弹所能引爆的最左段和最右端则可以用。至此,我们可以通过线段树优化建图,将时间复杂度降低到。这样就能保证我们可以通过这条边到达区间的任意端点。既然是有关区间的连边,我们可以很自然的想到。的任意一个点,只需要连一条有向边。对于方式3, 我们可以 把。点到每个点的最短距离。对于方式2,我们可以从。 阅读详情

线段树优化建图


前置思想

动态开点。

示例

操作

有如下 4 操作:

  1. 将 u u u 连到 v v v ,代价为 w w w。
  2. 将 u u u 连到 [ l , r ] [l,r] [l,r] ,代价为 w w w。
  3. 将 [ l , r ] [l,r] [l,r] 连到 v v v ,代价为 w w w。
  4. 将 [ u , v ] [u,v] [u,v] 连到 [ l , r ] [l,r] [l,r] ,代价为 w w w。
处理
  1. 直接连。
  2. 建立一棵线段树 s e g 1 seg1 seg1,设 p p p 节点表示区间 [ l , r ] [l,r] [l,r],将 u u u 连到 p p p 上。
  3. 建立一棵线段树 s e g 2 seg2 seg2,设 p p p 节点表示区间 [ l , r ] [l,r] [l,r],将 p p p 连到 v v v 上。
  4. 建立一个虚点 p 0 p0 p0,设 s e g 2 seg2 seg2 上 p 1 p1 p1 节点表示区间 [ u , v ] [u,v] [u,v],设 s e g 1 seg1 seg1 上 p 2 p2 p2 节点表示区间 [ l , r ] [l,r] [l,r],将 p 2 p2 p2 连到 p 0 p0 p0, p 0 p0 p0 连到 p 1 p1 p1。
注意事项
  1. 线段树上下层要记得连上,保证正确性。
  2. 空间要足够(图的空间大概是一般线段树的 9 倍,可以减少到 7 倍)。

模版题

题目链接:Legacy - CodeForces 787D.

思路:线段树优化建图,跑dij最短路

int n,Q,s;
struct Chain_Forward_Star{
	struct Edge{
		int v,w,nxt;
	}edge[N*36];
	int h[N*9],cnt;
	void init(){
		cnt=0;RCL(h,-1);
	}
	void add_edge(int u,int v,int w){
		edge[++cnt]={v,w,h[u]};
		h[u]=cnt;
	}
}cfs;
struct Double_Segment_Tree{
	#define ls (p<<1)
	#define rs (p<<1|1)
	int n,tot;
	struct node{
		int l,r,len,t;
	}tr[N<<2][2];
	void init(int _n){
		tot=n=_n;
		build(1,n,1,0),build(1,n,1,1);
	}//初始化
	void build(int l,int r,int p,bool t){
		tr[p][t]={l,r,r-l+1,++tot};
		if(l==r){
			if(!t)cfs.add_edge(tr[p][t].t,l,0);
			else cfs.add_edge(l,tr[p][t].t,0);
			return;
		}
		int mid=l+r>>1;
		build(l,mid,ls,t);
		build(mid+1,r,rs,t);
		if(!t)cfs.add_edge(tr[p][t].t,tr[ls][t].t,0),cfs.add_edge(tr[p][t].t,tr[rs][t].t,0);
		else cfs.add_edge(tr[ls][t].t,tr[p][t].t,0),cfs.add_edge(tr[rs][t].t,tr[p][t].t,0);
	}//建树
	#define mid (tr[p][t].l+tr[p][t].r>>1)
	int l,r,u,w,t;
	void update(int p){
		if(l<=tr[p][t].l&&tr[p][t].r<=r){
			if(!t)cfs.add_edge(u,tr[p][t].t,w);
			else cfs.add_edge(tr[p][t].t,u,w);
			return;
		}
		if(l<=mid)update(ls);
		if(r>mid)update(rs);
	}//加边 
    #undef mid
}seg;

主函数:

signed main(){
	cin>>n>>Q>>s;
	cfs.init(),seg.init(n);
	while(Q--){
		int opt;cin>>opt;
		if(opt==1){
			int u,v,w;cin>>u>>v>>w;
			cfs.add_edge(u,v,w);
		}else{
			int u,l,r,w;cin>>u>>l>>r>>w;
			seg.l=l,seg.r=r,seg.u=u,seg.w=w,seg.t=opt-2;
			seg.update(1);
		}
	}
	return 0;
}

【线段树】线段树优化建图(CF786B题解) 在开始之前,你应该了解如下知识: 完全二叉树的性质 线段树的原理及使用 图的存储方式及图论基础 我们首先看一道题:洛谷链接/CodeForces链接/Vjudge链接 上面这道题,我们首先考虑暴力建边,无论前面的建图部分还是后面的最短路,显然都是会超时的,然后我们观察题目,题目中提到每次对一整个[i, j]区间执行同一操作,所以我们考虑使用一些数据结构进行优化。 线段树优化建图 我们考虑,如果建立一个线段树,再用线段树上的节点代表区间,既然同一个操作对于区间... 阅读详情

相关推荐

emqx Java 订阅以及发送 结合若依框架

emqx Java 订阅以及发送 结合若依框架

Spo的博客 1613

P1816 忠诚

https://www.luogu.org/problem/P1816 #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <queue> #include <stack> #include <cma...

NOIP提高组日志 310

在VSCode中使用LaTex+(grammarly语法检测,chatgpt翻译,Sumatra PDF 轻量级pdf阅读器)

整个文章分为以下几个内容,打 * 的是必须要安装的。

u011895157的博客 2万+

线段树优化建图学习

线段树优化建图 在某次CYjian神犇给我推了一道树剖+线段树优化建图+2-SAT的好(毒瘤)题后,发现自己竟然还 不会线段树优化建图,于是赶紧滚去学了一波,记下笔记 作用 用来解决区间连边(l,r)的每个点向(L,R)的每个点连边的建图方法。可以优化空间和时间。 实现 以CF786B为例。 题目要求支持以下三个操作: 单个点向单个点连边,权值为v [l,r][l,r][l,r]中的...

Galaxy_yr的博客 692

获取气体传感器温度调制响应数据并转换为NumPy数组

本任务旨在获取气体传感器在温度调制条件下的响应数据,将其处理为结构化数据格式(NumPy数组),以便用于机器学习模型训练。整个过程包含数据采集、预处理、特征工程和格式转换等关键步骤。

huanghm88的专栏 1207

深入解析XTEA加密算法的核心机制与优化策略

本文深入解析XTEA加密算法的核心机制与优化策略,详细介绍了XTEA在嵌入式系统和资源受限环境中的优势,包括其高效的加解密速度和低资源消耗。文章还探讨了XTEA的轮函数设计、关键参数优化策略以及实战应用中的性能对比,为开发者提供了安全增强方案和优化技巧。

k8l9m0n的博客 243

线段树学习笔记

开始建树,如果你感到很烦躁,紧张,或是无处下手,可以另开一个文件,专心沉浸在建树之中。确定自己的线段树是用来干嘛的,把它的用途以及各种标记确定下来;(真正理解线段树的朋友应该可以懂)标记永久化:扔在主席树部分了。

PLUS_CAT的博客 747

【医学影像】Deep Learning for Automatic Pneumonia Detection

写在前面的话: 这篇论文是北美放射学会(RSNA)在Kaggle平台上托管的肺炎区域检测挑战赛取得第二名成绩的解决方案。因为笔者需要用到其中的图像增强方案,因此本篇博客只介绍了数据集和图像增强,关于模型的改进和其它改进点没有涉及。 论文地址:https://arxiv.org/abs/2005.13899 代码地址:https://github.com/tatigabru/kaggle-rsna 比赛地址:https://www.kaggle.com/c/rsna-pneumonia-detection-c

chenzhoujian_的博客 1567

RAG技术如何破解医疗AI三大难题:公平性、可解释性与个性化

检索增强生成(RAG)技术通过结合外部知识库来增强大语言模型的生成能力,其核心原理在于将信息检索与文本生成相结合,从而提升回答的准确性和可靠性。这项技术的核心价值在于能够有效缓解模型幻觉问题,并提供可追溯的答案来源,极大地增强了AI系统的可信度。在工程实践中,RAG被广泛应用于构建专业领域的智能问答、决策支持和知识管理系统。特别是在医疗健康领域,其对准确性、可解释性和合规性的严苛要求,与RAG技术的优势高度契合。本文聚焦于如何利用RAG框架,通过构建权威、多元的医学知识库,并在检索与生成环节嵌入临床逻辑与安

weixin_30645617的博客 322

python实现序列比对之Needleman-wunsch算法 (附完整源码)

python实现序列比对之Needleman-wunsch算法 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 461

Linux Namespace隔离实战:dd/mkfs/mount/unshare构建终极沙箱

内存占用 | 512MB+ | **<10MB** | 50倍节省 || 启动时间 | 15-45秒 | **0.1-0.5秒** | 100倍加速 || 磁盘空间 | GB级 | **MB级** | 显著减少 || 系统调用性能 | 有损耗 | **原生速度** | 零损耗 |

Loving_enjoy的博客 398

Dynamic‑SQL2 查询篇:MyBatis 增强利器,让 SQL 像写 Java 一样丝滑

Dynamic-SQL2 是一款 MyBatis 增强工具,旨在提供更自然流畅的 SQL 编写体验。最新版本 0.1.8 支持 Spring 2.x/3.x,通过 SqlContext 对象实现丰富的查询功能。核心特性包括:基础查询(列表/单列/单条记录)、灵活的结果映射(toList/toOne/toMap/toGroupingBy)、复杂查询能力(多级 Join/子查询/JSON 表展开)、动态列引用、分页体系和安全防护。其设计理念是让 SQL 编写如同 Java 代码般自然,复杂查询像搭积木一样组合,

csdn_is_whore的博客 707

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【模板】线段树优化建图

Problem 三种方案:v to u,v to [l,r],[l,r] to v。 求单源最短路。 Solution 由于存在结点与区间内所有结点间的连边,可以考虑用线段树优化建图。 具体来说维护两个线段树,线段树1表示有向边的终止结点,同时父亲连向儿子权为0;线段树2表示有向边的起始结点,同时儿子连向父亲权为0。两线段树的叶子结点间连无向边权为0(线段树1的叶子结点连向线段树2的叶子结点也可),表示同一结点自己和自己是连通的;对于任意有向边,线段树2连向线段树1,如图: Code #inclu

gyp0205的博客 1156

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

线段树优化建图[模板]

线段树优化建图 Codeforces B模板 #include <bits/stdc++.h> using namespace std; #define ls (rt<<1) #define rs (rt<<1|1) #define mid (l+r>>1) #define lson ls,l,mid #define rson rs,mid+1,r typedef long long ll; const int maxn=2e6+10; const ll in

jziwjxjd的博客 486

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

20.07.21总结

线段树优化建图

萍水相逢,尽是他乡之客 165

线段树优化建图详解——区间连边之技巧,吊打紫题之利器

我们从一道例题开始。 CF786B Description Solution 朴素解法: 暴力连边+最短路 对于每次连边操作,我们逐一连边,最后在图上跑一遍单源最短路径算法即可。 时间复杂度O(n2log⁡(n2))O(n^2 \log (n^2))O(n2log(n2))。 正解: 线段树优化建图 线段树有一个非常优美的性质: 区间[l,r][l,r][l,r]可以被映射成线段树上的许多连续的区间,且这些区间的数量不超过⌈log⁡n⌉\lceil \log n \rceil⌈logn⌉。 我们要巧妙运用

Cherrt的博客 2962

学习笔记第二十六节:线段树优化建图

正题       这真是一个神奇的东西。       既然有这个算法,那么就一定有他能解决的题目。       我们以这一题为例:[POI2015]PUS。       给出n个数,m个操作,每次规定l到r中的k个数比这个区间的其他数大,询问是否有解。       简化问题,给出n个数,m个操作,每次规定第a个数比第b个数大。(还规定一些数的值       那么很明显是一个差分约束的问...

Deep_Kevin的娱乐空间 711
上一篇: 势能线段树学习笔记
下一篇: 主席树(可持久化线段树)学习笔记
Add_Catalyst
博客等级 码龄3年 211粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值