码迷,mamicode.com
首页 > 其他好文 > 详细

DFS 序 1 (Loj#144)

时间:2018-11-19 20:20:05      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:lse   bit   ++   efi   upd   数组   cst   size   pre   

又到了快乐的板子题时间了!!!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)

标签:lse   bit   ++   efi   upd   数组   cst   size   pre   

原文地址:https://www.cnblogs.com/ddddeacde/p/9984475.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!