28pts求调

P3384 【模板】重链剖分/树链剖分

zsh_haha @ 2023-12-09 21:32:11

原因:死循环

#include<bits/stdc++.h>
using namespace std;
struct node{
    long long v,ne; 
}e[200005];
long long h[100005],cnt;
void add(long long u,long long v){
    e[++cnt].ne=h[u];
    h[u]=cnt;
    e[cnt].v=v;
}
long long n,m,r,p;
long long w[100005];
long long dep[100005],fa[100005],son[100005],wss[100005];
void dfs1(long long depp,long long fat,long long x){
    dep[x]=depp;
    fa[x]=fat;
    son[x]=1;
    for(long long i=h[x];i;i=e[i].ne){
        long long v=e[i].v;
        if(v!=fat){
            dfs1(depp+1,x,v);
            son[x]+=son[v];
            if(son[wss[x]]<=son[v]){
                wss[x]=v;
            }
        }
    }
}
long long num[100005],wt[100005],top[100005];
void dfs2(long long topp,long long x){
    top[x]=topp;
    num[x]=++cnt;
    wt[cnt]=w[x];
    if(wss[x]==0){
        return;
    }
    dfs2(topp,wss[x]);
    for(long long i=h[x];i;i=e[i].ne){
        long long v=e[i].v;
        if(v!=fa[x]&&v!=wss[x]){
            dfs2(v,v);
        }
    }
}
struct nod{
    long long l,r,val,tag;
}tr[800005];
void build(long long root,long long l,long long r){
    tr[root].l=l;
    tr[root].r=r;
    if(l==r){
        tr[root].val=wt[l]%p;
        return;
    }
    long long mid=(l+r)/2;
    build(root*2,l,mid);
    build(root*2+1,mid+1,r);
    tr[root].val=(tr[root*2].val+tr[root*2+1].val)%p;
}
void pushdown(long long root){
    tr[root*2].tag+=tr[root].tag;
    tr[root*2].tag%p;
    tr[root*2+1].tag+=tr[root].tag;
    tr[root*2+1].tag%p;
    tr[root*2].val+=tr[root].tag*(tr[root*2].r-tr[root*2].l+1)%p;
    tr[root*2].val%p;
    tr[root*2+1].val+=tr[root].tag*(tr[root*2+1].r-tr[root*2+1].l+1)%p;
    tr[root*2+1].val%p;
    tr[root].tag=0;
}
void updata(long long root,long long l,long long r,long long z){
    long long ll=tr[root].l,rr=tr[root].r;
    if(l>rr||ll>r){
        return;
    }
    if(l<=ll&&r>=rr){
        tr[root].tag+=z;
        tr[root].tag%=p;
        tr[root].val+=z*(tr[root].r-tr[root].l+1)%p;
        tr[root].val%=p;
        return;
    }
    pushdown(root);
    updata(root*2,l,r,z);
    updata(root*2+1,l,r,z);
    tr[root].val=(tr[root*2].val+tr[root*2+1].val)%p;
}
long long fsum(long long root,long long l,long long r){
    long long ll=tr[root].l,rr=tr[root].r;
    if(l>rr||ll>r){
        return 0;
    }
    if(l<=ll&&r>=rr){
        return tr[root].val;
    }
    pushdown(root);
    return (fsum(root*2,l,r)+fsum(root*2+1,l,r))%p;
}
void swa(long long x,long long y,long long z){
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]]){
            swap(x,y);
        }
        updata(1,num[top[x]],num[x],z);
        x=fa[top[x]];
    }
    if(dep[x]>dep[y]){
        swap(x,y);
    }
    updata(1,num[x],num[y],z);
}
long long sws(long long x,long long y){
    long long sum=0;
    while(top[x]!=top[y]){
        if(dep[top[x]]>dep[top[y]]){
            swap(x,y);
        }
        sum=(sum+fsum(1,num[top[y]],num[y]))%p;
        y=fa[top[y]];
    }
    if(dep[x]>dep[y]){
        swap(x,y);
    }
    sum=(sum+fsum(1,num[x],num[y]))%p;
    return sum;
}
void sta(long long x,long long z){
    updata(1,num[x],num[x]+son[x]-1,z);
}
long long sts(long long x){
    return fsum(1,num[x],num[x]+son[x]-1);
}
int main(){
    cin>>n>>m>>r>>p;
    for(long long i=1;i<=n;i++){
        cin>>w[i];
    }
    for(long long i=1;i<n;i++){
        long long u,v;
        cin>>u>>v;
        add(u,v);
        add(v,u);
    }
    dfs1(1,0,r);
    cnt=0;
    dfs2(1,r);
    build(1,1,n);
    for(long long i=1;i<=m;i++){
        long long op,x,y,z;
        cin>>op;
        if(op==1){
            cin>>x>>y>>z;
            swa(x,y,z%p);
        }else if(op==2){
            cin>>x>>y;
            cout<<sws(x,y)<<endl;
        }else if(op==3){
            cin>>x>>z;
            sta(x,z%p);
        }else if(op==4){
            cin>>x;
            cout<<sts(x)<<endl;
        }
    }
    return 0;
}

by control_our_own_life @ 2023-12-09 21:40:05

nj!


by zsh_haha @ 2023-12-09 21:41:28

调出来了,此贴终.


by control_our_own_life @ 2023-12-09 21:41:57

@zsh_haha 6


by Kniqht @ 2023-12-30 13:33:03

@zsh_haha 大佬,所以您是哪里错了,我也28pts TLE


by zsh_haha @ 2023-12-30 17:51:31

@Kniqht 检查一下在主函数调用函数时参数是否给错了


|