DFS 序 1 (Loj#144)

Posted ddddeacde

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DFS 序 1 (Loj#144)相关的知识,希望对你有一定的参考价值。

又到了快乐的板子题时间了!!!QwQ
技术分享图片
显然这道题用线段树是可以做的 ,

但是蒟蒻的我还是想用树状数组写(好吧还是因为太懒了)

所以就变成了一个树状数组的单点修改+区间查询+跑一个DFS的题目

代码如下

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define LL long long
using namespace std;
const int maxn=1e6+5;
int n,m,R,x,y;
LL c[maxn],a[maxn],r[maxn],l[maxn];
LL ans=0;
vector<int>g[maxn];
int lowbit(int x){
  return x&(-x);
}
void update(int x,int v){
  for(int i=x;i<=n;i+=lowbit(i)){
      c[i]+=v;
  }
}
LL query(int x){
  LL ans=0;
  for(int i=x;i>0;i-=lowbit(i)){
      ans+=c[i];
  }
  return ans;
}
void dfs(int u,int fa){
  l[u]=++ans;
  update(ans,a[u]);
  for(int i=0;i<g[u].size();i++){
      int x=g[u][i];
      if(x==fa)continue;
      dfs(x,u);
  }
  r[u]=ans;
}
int main(){
  scanf("%d%d%d",&n,&m,&R);
  for(int i=1;i<=n;i++){
      scanf("%d",&a[i]);
  }
  for(int i=1;i<n;i++){
      int u,v;scanf("%d%d",&u,&v);
      g[u].push_back(v);
      g[v].push_back(u);
  }
  dfs(R,0);
  for(int i=1;i<=m;i++){
      int x,y,z;scanf("%d",&x);
      if(x==1){
          scanf("%d%d",&y,&z);
          update(l[y],z);
      }
      else{
          scanf("%d",&y);
          ans=query(r[y])-query(l[y]-1);
          printf("%lld
",ans);
      }
  }
  return 0;
}

以上是关于DFS 序 1 (Loj#144)的主要内容,如果未能解决你的问题,请参考以下文章

[leetcode] 144. 二叉树的前序遍历

144_二叉树的前序遍历

二叉树的前序遍历144

异象石

java刷题-144二叉树的前序遍历

⭐算法入门⭐《二叉树》简单09 —— LeetCode 144. 二叉树的前序遍历