RE 求条
查看原帖
RE 求条
1373205
dg114514楼主2025/6/25 17:17

不是 lz 怎么这么菜啊,连 RE 都看不出来,甚至还是样例 RE(

code:

#include<bits/stdc++.h>
using namespace std;
constexpr int N=1e5+5;
struct node{
    int tag,sum;
}t[N<<2];
vector<int> tr[N];
int a[N],siz[N],fa[N],dep[N],son[N],dfn[N],top[N],cnt,n,q,r,mod;
void build(int u,int l,int r){
    if(l==r) t[u].sum=a[l]%mod;
    else{
        int mid=l+r>>1;
        build(u<<1,l,mid);
        build(u<<1|1,mid+1,r);
        t[u].sum=(t[u<<1].sum+t[u<<1|1].sum)%mod;
    }
}
void pushdown(int x,int l,int r){
    if(t[x].tag){
        int mid=l+r>>1;
        t[x<<1].sum=(t[x<<1].sum+(mid-l+1)*t[x].tag)%mod;
        t[x<<1].tag=(t[x<<1].tag+t[x].tag)%mod;
        t[x<<1|1].sum=(t[x<<1|1].sum+(r-mid)*t[x].tag)%mod;
        t[x<<1|1].tag=(t[x<<1|1].tag+t[x].tag)%mod;
        t[x].tag=0;
    }
}
void update(int ql,int qr,int x,int l=1,int r=n,int u=1){
    if(ql<=l&&r<=qr){
        t[u].tag=(t[u].tag+x)%mod;
        t[u].sum=(t[u].sum+(r-l+1)*x)%mod;
    }
    else{
        int mid=l+r>>1;
        pushdown(u,l,r);
        if(mid>=ql) update(ql,qr,x,l,mid,u<<1);
        if(qr>=mid+1) update(ql,qr,x,mid+1,r,u<<1|1);
        t[u].sum=(t[u<<1].sum+t[u<<1|1].sum)%mod;
    }
}
int query(int ql,int qr,int l=1,int r=n,int u=1){
    if(ql<=l&&r<=qr) return t[u].sum%mod;
    pushdown(u,l,r);
    int ans=0,mid=l+r>>1;
    if(mid>=ql) ans=(ans+query(ql,qr,l,mid,u<<1))%mod;
    if(qr>=mid+1) ans=(ans+query(ql,qr,mid+1,r,u<<1|1))%mod;
    return ans;
}
void dfs1(int x,int f=0,int de=1){
    fa[x]=f,siz[x]=1,dep[x]=de;
    for(auto &i:tr[x])
        if(i!=f){
            dfs1(i,x,de+1),siz[x]+=siz[i];
            if(siz[i]>siz[son[x]]) son[x]=i;
        }   
}
void dfs2(int x,int tp){
    dfn[x]=++cnt,top[x]=tp;
    if(son[x]){
        dfs2(son[x],tp);
        for(auto &i:tr[x])
            if(i!=fa[x]&&i!=son[x])
                dfs2(i,i);  
    }
}
inline int qsum(int x){return query(dfn[x],dfn[x]+siz[x]-1)%mod;}
inline void usum(int x,int u){update(dfn[x],dfn[x]+siz[x]-1,u);}
inline int qpath(int x,int y){
    int ans=0;
    while(top[x]!=top[y]){
        if(dep[top[x]]>dep[top[y]]) swap(x,y);
        ans=(ans+query(dfn[top[x]],dfn[x]))%mod;
        x=fa[top[x]];
    }
    if(dep[x]>dep[y]) swap(x,y);
    return (ans+query(dfn[x],dfn[y]))%mod;
}
inline void upath(int x,int y,int u){
    while(top[x]!=top[y]){
        if(dep[top[x]]>dep[top[y]]) swap(x,y);
        update(dfn[top[x]],dfn[x],u);
        x=fa[top[x]];
    }
    if(dep[x]>dep[y]) swap(x,y);
    update(dfn[x],dfn[y],u);
}
void init(){dfs1(r);dfs2(r,r);build(1,1,n);}
int main(){
    ios::sync_with_stdio(false),cin.tie(nullptr);
    int op,x,y,u,v;
    cin>>n>>q>>r>>mod;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<n;i++) cin>>u>>v,tr[u].push_back(v),tr[v].push_back(u);
    init();
    while(q--){
        cin>>op>>x;
        if(op==1) cin>>y>>u,upath(x,y,u);
        else if(op==2) cin>>y,cout<<qpath(x,y)<<"\n";
        else if(op==3) cin>>u,usum(x,u);
        else cout<<qsum(x)<<"\n";
    }
    return 0;
}
2025/6/25 17:17
加载中...