dfs序即先序遍历树,对于第一个节点进行总结点个数加一并且赋值操作。
思路:
对于给出的点,进行vecter建树。建树完成后dfs序求出各节点,dfs序,ls[i]表示当前节点的dfs序为多少,rs[i]表示以当前节点为根的子树的最右边节点值。
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <vector>
using namespace std;
const int M=4e4+100;
vector<int>v[M];
int ls[M],rs[M],cnt;
void dfs(int rt,int now)
{
ls[now]=++cnt;
for(int i=0;i<v[now].size();i++)
{
if(v[now][i]!=rt)
{
dfs(now,v[now][i]);
}
}
rs[now]=cnt;
}
long long tr[M*4];
int n;
void build(int i,int l,int r)
{
if(l==r)
{
tr[i]=0;
return;
}
int mid=(l+r)/2;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
tr[i]=tr[i*2]+tr[i*2+1];
}
void update(int i,int l,int r,int x)
{
if(l==r)
{