蒟蒻求调(全WA)!!!
查看原帖
蒟蒻求调(全WA)!!!
856459
yangjunhan1楼主2023/8/4 15:11
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int dfns[N],dfn[N],T,n,m,w[N],head[N],tot,siz[N],dep[N],fa[N],t[N],zez[N],out[N],val[N];
int sum[N<<2],mv[N<<2],lazy[N<<2];
struct qp{
    int to,ne;
}e[N<<1];
void add(int u,int v){
    e[++tot]={v,head[u]};
    head[u]=tot;
}
void zx(int u){
    siz[u]=1;
    for(int i=head[u];~i;i=e[i].ne){
        int v=e[i].to;
        if(v==fa[u])    continue;
        fa[v]=u;
        dep[v]=dep[u]+1;
        zx(v);
        if(siz[v]>siz[zez[u]])  zez[u]=v;
        siz[u]+=siz[v];
    }
}
void sp(int u,int sb){
    dfn[u]=++T,dfns[T]=u,t[u]=sb;
    if(zez[u])  sp(zez[u],sb);
    for(int i=head[u];~i;i=e[i].ne){
        int v=e[i].to;
        if(v!=zez[u] && v!=fa[u])   sp(v,v);
    }
    out[u]=T;
}
int lca(int u,int v){
    while(t[u]!=t[v]){
        if(dep[t[u]]>dep[t[v]]) swap(u,v);
        u=fa[t[u]];
    }
    return dep[u]<dep[v]?u:v;
}
void pushdown(int ro,int l,int r){
    if(!lazy[ro])   return ;
    int mid=(l+r)>>1,sl=ro<<1,sr=ro<<1|1;
    sum[sl]+=lazy[ro]*(mid-l+1),sum[sr]+=lazy[ro]*(r-mid);
    lazy[sl]+=lazy[ro],lazy[sr]+=lazy[ro];
    lazy[ro]=0;
}
void xg(int ro,int l,int r,int q,int v){
    if(l==r && l==q){
        sum[ro]+=v,mv[ro]+=v;
        return ;
    }
    int mid=(l+r)>>1;
    pushdown(ro,l,r);
    if(q<=mid)  xg(ro<<1,l,mid,q,v);
    else    xg(ro<<1|1,mid+1,r,q,v);
    sum[ro]=sum[ro<<1]+sum[ro<<1|1];
}
void qjxg(int ro,int l,int r,int ql,int qr,int v){
    if(l>=ql && qr>=r){
        lazy[ro]+=v;
        sum[ro]+=(r-l+1)*v;
        return ;
    }
    int mid=(l+r)>>1;
    pushdown(ro,l,r);;
    if(ql<=mid) qjxg(ro<<1,l,mid,ql,qr,v);
    if(qr>mid)  qjxg(ro<<1|1,mid+1,r,ql,qr,v);
    sum[ro]=sum[ro<<1]+sum[ro<<1|1];
}
int gsxds(int ro,int l,int r,int ql,int qr){
    if(ql<=l && qr>=r)  return sum[ro];
    int mid=(l+r)>>1,s=0;
    pushdown(ro,l,r);
    if(ql<=mid) s+=gsxds(ro<<1,l,mid,ql,qr);
    if(qr>mid)  s+=gsxds(ro<<1|1,mid+1,r,ql,qr);
    return s;
}
int gstr(int u,int v){
    int s=0;
    while(t[u]!=t[v]){
        if(dep[t[u]]<dep[t[v]]) swap(u,v);
        s+=gsxds(1,1,n,dfn[t[u]],dfn[u]);
        u=fa[t[u]];
    }
    if(dep[u]<dep[v])   swap(u,v);
    s+=gsxds(1,1,n,dfn[v],dfn[u]);
    return s;
}
int main(){
    cin>>n>>m;
    memset(head,-1,sizeof head);
    for(int i=1;i<=n;i++)
        cin>>val[i];
    for(int i=1;i<n;i++){
        int a,b;
        cin>>a>>b;
        add(a,b);
        add(b,a);
    }
    zx(1);
    sp(1,1);
    for(int i=1;i<=n;i++)
        xg(1,1,n,dfn[i],val[i]);
    while(m--){
        int op,x,a;
        cin>>op>>x;
        if(op==1){
            cin>>a;
            xg(1,1,n,dfn[x],a);
        }
        else if(op==2){
            cin>>a;
            qjxg(1,1,n,dfn[x],out[x],a);
        }
        else    cout<<gstr(dfn[x],1)<<endl;
    }
    return 0;
}
2023/8/4 15:11
加载中...