HUSTOJ 1009: 第一个简单题(DFS序+树状数组)

本文介绍了一种结合DFS序和树状数组的数据结构处理方法,用于解决树形结构上的动态查询和更新问题。通过深度优先搜索预处理节点的访问顺序,再利用树状数组高效维护区间求和,实现对树上路径的快速操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://129.211.20.246/problem.php?id=1009

思路:DFS序先处理,然后树状数组维护。

#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<vector>
#define ll long long
using namespace std;
const ll Max=1e6+5;
ll A[Max],fi[Max],la[Max],tot=0,b[Max],T[4*Max];
vector<ll>v[Max];
ll dfs(ll r)
{
    b[r]=1;
    fi[r]=++tot;
    for(ll i=0;i<v[r].size();i++)
    {
        ll u=v[r][i];
        if(!b[u])
        {
            dfs(u);
            ++tot;
        }
    }
    la[r]=tot;
    return 0;
}
ll lowbit(ll x)
{
    return x&(-x);
}
ll add(ll x,ll k)
{
    while(x<4*Max)
    {

        T[x]+=k;
        x+=lowbit(x);
    }
    return 0;
}
ll re(ll x)
{
    ll ans=0;
    while(x>0)
    {
        ans+=T[x];
        x-=lowbit(x);
    }
    return ans;
}
int main()
{
//    add(1,8);
//    printf("%d\n",re(1));
    ll n,m,r,x,y;
    scanf("%lld%lld%lld",&n,&m,&r);
    for(ll i=1;i<=n;i++)
        scanf("%lld",&A[i]);
    for(ll i=1;i<n;i++)
    {
        scanf("%lld%lld",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(r);
    for(ll i=1;i<=n;i++)
        add(fi[i],A[i]);
    for(ll i=1;i<=m;i++)
    {
        scanf("%lld",&x);
        if(x==1)
        {
            scanf("%lld%lld",&x,&y);
            add(fi[x],y);
        }
        else
        {
            scanf("%lld",&y);
            printf("%lld\n",re(la[y])-re(fi[y]-1));
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值