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