HDU - 3966 Aragorn's Story (树链剖分+树状数组)

题目链接

题目大意:给你一颗树,树上的每个结点有一个权值。一共有三种操作:

(1)将结点u与v之间路径上的所有点的权值+x

(2)将结点u与v之间路径上的所有点的权值-x

(3)询问结点u的权值

树链剖分入门题

#include
using namespace std;
typedef long long ll;
const int N=5e4+10;
int head[N],nxt[N<<1],to[N<<1],nEdge;
int fa[N],son[N],top[N],dep[N],siz[N],tid[N],rnk[N],nnode;
int c[N],a[N];
int n,m,P;

int lowbit(int x) {return x&-x;}
void add(int u,int x)
{
    while(usiz[son[u]])son[u]=v;
    }
}

void dfs2(int u)
{
    tid[u]=++nnode,rnk[nnode]=u;
    if(!~son[u])return;
    top[son[u]]=top[u],dfs2(son[u]);
    for(int e=head[u]; ~e; e=nxt[e])
    {
        int v=to[e];
        if(v==son[u]||v==fa[u])continue;
        top[v]=v,dfs2(v);
    }
}

void update(int u,int v,int x)
{
    while(top[u]!=top[v])
    {
        if(dep[top[u]]

 

你可能感兴趣的:(树链剖分)