树链剖分板子WA0求条
查看原帖
树链剖分板子WA0求条
530468
_determination_楼主2024/1/17 13:05
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define inf (int)1e18
#define debug cout << "IAKIOI" << endl
using namespace std;
vector<int>e[100010];
int fa[100010],siz[100010],dep[100010],son[100010];
int id[100010],bef[100010],top[100010],tot;
int a[100010];
void dfs1(int x,int f)
{
    fa[x]=f;
    dep[x]=dep[f]+1;
    for ( int i = 0 ; i < e[x].size() ; i++ )
    {
        int v=e[x][i];
        if(v==f)
        {
            continue;
        }
        dfs1(v,x);
        siz[x]+=siz[v];
        if(siz[son[x]]<siz[v])
        {
            son[x]=v;
        }
    }
    siz[x]++;
}
void dfs2(int x,int head)
{
    if(x==0)
    {
        return;
    }
    top[x]=head;
    id[x]=++tot;
    bef[tot]=x;
    dfs2(son[x],head);
    for ( int i = 0 ; i < e[x].size() ; i++ )
    {
        int v=e[x][i];
        if(v==fa[x]||v==son[x])
        {
            continue;
        }
        dfs2(v,v);
    }
}
struct abc{
    int l,r,val,tag;
    int siz()
    {
        return r-l+1;
    }
}t[400010];
void pd(int x)
{
    if(t[x].tag==0||t[x].l==t[x].r)
    {
        return;
    }
    t[x<<1].tag+=t[x].tag;
    t[x<<1|1].tag+=t[x].tag;
    t[x<<1].val+=t[x<<1].siz()*t[x].tag;
    t[x<<1|1].val+=t[x<<1|1].siz()*t[x].tag;
    t[x].tag=0;
}
void build(int x,int l,int r)
{
    t[x].l=l;
    t[x].r=r;
    if(l==r)
    {
        t[x].val=a[bef[l]];
        return;
    }
    int mid=(l+r)/2;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
    t[x].val=t[x<<1].val+t[x<<1|1].val;
}
void upd(int x,int l,int r,int v)
{
    int lf=t[x].l;
    int rt=t[x].r;
    if(l<=lf&&rt<=r)
    {
        t[x].val+=t[x].siz()*v;
        t[x].tag+=v;
        return;
    }
    if(rt<l||r<lf)
    {
        return;
    }
    pd(x);
    upd(x<<1,l,r,v);
    upd(x<<1|1,l,r,v);
    t[x].val=t[x<<1].val+t[x<<1|1].val;
}
int calc(int x,int l,int r)
{
    int lf=t[x].l;
    int rt=t[x].r;
    if(l<=lf&&rt<=r)
    {
        return t[x].val;
    }
    if(rt<l||r<lf)
    {
        return 0;
    }
    pd(x);
    return calc(x<<1,l,r)+calc(x<<1|1,l,r);
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int n,q;
    cin >> n >> q;
    for ( int i = 1 ; i <= n ; i++ )
    {
        cin >> a[i];
    }
    for ( int i = 1 ; i < n ; i++ )
    {
        int u,v;
        cin >> u >> v;
        e[u].push_back(v);
        e[v].push_back(u); 
    }
    dfs1(1,1);
    dfs2(1,1);
    build(1,1,n);
    while(q--)
    {
        int op,x,a;
        cin >> op >> x;
        if(op==1)
        {
            cin >> a;
            upd(1,id[x],id[x],a);
        }else if(op==2)
        {
            cin >> a;
            upd(1,id[x],id[x]+siz[x]-1,a);
        }else{
            int ans=0;
            while(x!=1)
            {
                ans+=calc(1,id[top[x]],id[x]);
                x=fa[top[x]];
            }
            cout << ans << endl;
        }
    }
	return 0;
}
2024/1/17 13:05
加载中...