1. 程式人生 > >DFS 序 1 (Loj#144)

DFS 序 1 (Loj#144)

但是 spa algorithm pda algo oid fine ret long

又到了快樂的板子題時間了!!!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\n",ans);
      }
  }
  return 0;
}

DFS 序 1 (Loj#144)