• 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;
    }
    
    
  • 相关阅读:
    报数游戏
    Dynamics CRM 2013 初体验(2):UI
    Lucene.net常见功能实现知识汇总
    hdu 1853 最小费用流好题 环的问题
    MessagerService总结
    [置顶] Android EditText/TextView使用SpannableString显示复合文本
    MySQL Dll语句
    JavaScript表单验证
    intellij—idea14 注冊机
    OL记载Arcgis Server切片
  • 原文地址:https://www.cnblogs.com/ddddeacde/p/9984475.html
Copyright © 2020-2023  润新知