牛客——求和(dfs序+树状数组)

简介: 牛客——求和(dfs序+树状数组)

原题链接

题意:

给定一棵树,有点权;两种操作,一是修改某个单点的权值,二是查询某个点为根节点的子树的点权之和。

思路:

dfs序后,子树都处于一个区间里,所以问题就转化成了单点修改、区间求和。

树状数组维护即可。

代码:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=1e6+7;
int n,m,k;
int h[maxn],idx;
struct node{
    int e,ne;
}edge[maxn*2];
ll w[maxn],tr[maxn*4];
void add(int u,int v){///前向星存图
    edge[idx]={v,h[u]};h[u]=idx++;
}
ll in[maxn],out[maxn],timetmp;
void dfs(int u,int fa){//dfs记录dfs序列
    in[u]=++timetmp;
    for(int i=h[u];~i;i=edge[i].ne){
        int j=edge[i].e;
        if(j==fa) continue;
        dfs(j,u);
    }
    out[u]=timetmp;
}
///树状数组维护区间
ll lowbit(int x){
    return x&(-x);
}
void update(int pos,int val){
    while(pos<maxn){
        tr[pos]+=val;
        pos=pos+lowbit(pos);
    }
}
ll qask(int pos){
    ll res=0;
    while(pos){
        res+=tr[pos];
        pos=pos-lowbit(pos);
    }
    return res;
}
int main(){
    cin>>n>>m>>k;
    memset(h,-1,sizeof h);
    for(int i=1;i<=n;i++) cin>>w[i];
    for(int i=1;i<n;i++){
        ll u,v;
        cin>>u>>v;
        add(u,v);add(v,u);
    }
    dfs(k,-1);
    for(int i=1;i<=n;i++)
        update(in[i],w[i]);
    while(m--){
        int op;cin>>op;
        if(op==1){
            ll pos,x;
            cin>>pos>>x;
            update(in[pos],x);
        }
        else{
            int pos;cin>>pos;
            printf("%lld\n",qask(out[pos])-qask(in[pos]-1));
        }
    }
    return 0;
}
目录
相关文章
|
8月前
|
算法 Java
LeetCode寻找两个有序数组的中位数打败100%人
LeetCode寻找两个有序数组的中位数打败100%人
71 0
|
算法 Android开发
LeetCode 周赛上分之旅 #38 结合排序不等式的动态规划
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
90 0
|
存储 人工智能 测试技术
【AcWing每日一题】4644. 求和
【AcWing每日一题】4644. 求和
79 0
|
8月前
考研高数之无穷级数题型二:求和函数(题目讲解)
考研高数之无穷级数题型二:求和函数(题目讲解)
141 0
|
8月前
|
算法
六六力扣刷题数组之有序数组的平方
六六力扣刷题数组之有序数组的平方
52 0
|
算法
代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、209.长度最小的子数组、59. 螺旋矩阵 II
代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、209.长度最小的子数组、59. 螺旋矩阵 II
61 0
|
算法
数星星(树状数组模板题)
数星星(树状数组模板题)
71 0
每日一题——有序数组的平方
每日一题——有序数组的平方
|
存储
蓝桥杯 ADV_303 数组求和
蓝桥杯 ADV_303 数组求和
87 0
|
存储 算法 索引
【每日挠头算法题】LeetCode 1337. 矩阵中战斗力最弱的 K 行 —— 二分 + 排序 / 堆
【每日挠头算法题】LeetCode 1337. 矩阵中战斗力最弱的 K 行 —— 二分 + 排序 / 堆
129 0
【每日挠头算法题】LeetCode 1337. 矩阵中战斗力最弱的 K 行 —— 二分 + 排序 / 堆