DFS序线段树

这篇博客介绍了如何使用DFS序和线段树解决HDU 3974问题。DFS序是指在深度优先搜索过程中节点进出栈的时间序列,它能将树区间转化为线性结构,便于处理树上修改的问题。文章通过实例展示了如何标记DFS序的时间戳,将子树操作转换为线性区间操作,并提供了相关代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HDU 3974

题目要在树上进行修改,由于线段树专题且此题也并非对单链进行操作所以不需要用到树链剖分(其实是我太蒻了不会而已),不过还是需要用到它的前置知识–dfs序。

简单做个dfs序的笔记。
dfs序:每个节点在dfs中进出栈的时间序列。
常用于把树区间化(化为线性),从而求出每个节点的“管辖区间”。
而且对于以某一节点为根的子树,它的dfs序中一定是连续的一段。
那么如何限定这个“管辖区间”?
答:标记dfs进入x (in)、离开x (out)的“时间戳”。

如下树:
在这里插入图片描述
上图树的dfs序:
在这里插入图片描述
再如下图,求出dfs序并保存各个结点的时间戳后,每个结点都有了区间的性质,因此对子树的操作即可转化为对时间戳区间(线性的)的操作。

本题代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5e5+10;
int n,m,t;
int h[N],e[N],ne[N],idx;
int in[N],out[N],cnt;//in[x]:dfs进入x的时间戳 out[x]:dfs离开x的时间戳
int ind[N];
struct node
{
   
   
    int l,r,val;
    int lazy;//区间改
}tr[4*N];
void init()
{
   
   
    cnt=0,idx=0;
    memset(h,-1,sizeof h);//!!!
    memset(ind,0,sizeof ind);
    memset(in,0,sizeof in);
    memset(out,0,sizeof out);
}
void add(int x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值