社区讨论

???怎么就WA了呢????

P3178[HAOI2015] 树上操作参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi6mfnmd
此快照首次捕获于
2025/11/20 07:16
4 个月前
此快照最后确认于
2025/11/20 07:16
4 个月前
查看原帖
#####树剖AC的代码去掉取模,ans改LL为什么就全wa了???????
CPP
#include<bits/stdc++.h>
#define Ri register int 
#define ll long long  
using namespace std;
const int maxn=100010;
struct node{
    int val;//若以后有其他操作可以修改 
}a[maxn];
int Head[maxn],Next[maxn<<1],V[maxn<<1],tot=0;
int n,m;
inline void Add(int u,int v){
    V[++tot]=v;
    Next[tot]=Head[u];
    Head[u]=tot;
}
int son[maxn],size[maxn],fa[maxn],deep[maxn];
inline void fdfs(int u){
    int v;
    son[u]=0;
    size[u]=1;
    for(Ri i=Head[u];i;i=Next[i]){
        v=V[i];
        if(fa[u]==v)continue;
        fa[v]=u;
        deep[v]=deep[u]+1;
        fdfs(v);
        size[u]+=size[v];
        if(size[son[u]]<size[v])son[u]=v;
    }
}
int maxson[maxn],tid[maxn],nid[maxn],top[maxn],newid=0;
inline void sdfs(int u,int anc){
    tid[u]=++newid;nid[newid]=u;
    top[u]=anc;
    maxson[u]=newid;
    if(son[u]){
        sdfs(son[u],anc);
        maxson[u]=max(maxson[son[u]],maxson[u]);
    }
    for(Ri i=Head[u];i;i=Next[i]){
        int v=V[i];
        if(v==fa[u]||v==son[u])continue;
        sdfs(v,v);
        maxson[u]=max(maxson[v],maxson[u]);
    }
}
int tree[maxn<<2],lazy[maxn<<2];
inline void pushup(int x){
    tree[x]=(tree[x<<1]+tree[x<<1|1]);
}
inline void pushdown(int x,int l,int r){
    if(!lazy[x])return ;
    int k=lazy[x];
    lazy[x]=0;
    lazy[x<<1]=(lazy[x<<1]+k);
    lazy[x<<1|1]=(lazy[x<<1|1]+k);
    int mid=(l+r)>>1;
    tree[x<<1]=(tree[x<<1]+(mid-l+1)*k);
    tree[x<<1|1]=(tree[x<<1|1]+(r-mid)*k);
}
inline void add(int x,int l,int r,int si,int ti,int k){
    if(si>ti)swap(si,ti);
    if(si<=l&&r<=ti){
        tree[x]=(tree[x]+(r-l+1)*k);
        lazy[x]=(lazy[x]+k);
        return;
    }
    int mid=(l+r)>>1;
    pushdown(x,l,r);
    if(si<=mid)add(x<<1,l,mid,si,ti,k);
    if(ti>=mid+1)add(x<<1|1,mid+1,r,si,ti,k);
    pushup(x);
}
ll ans=0;
inline void query(int x,int l,int r,int si,int ti){
    if(si>ti)swap(si,ti);
    if(si<=l&&r<=ti){
        ans=(ans+tree[x]);
        return;
    }
    int mid=(l+r)>>1;
    pushdown(x,l,r);
    if(si<=mid)query(x<<1,l,mid,si,ti);
    if(mid+1<=ti)query(x<<1|1,mid+1,r,si,ti);
    pushup(x);    
}
inline void build(int x,int l,int r){
    if(l==r){
        tree[x]=a[nid[l]].val;
        return;
    }
    int mid=(l+r)>>1;
    if(l<r){
        build(x<<1,l,mid);
        build(x<<1|1,mid+1,r);
    }
    pushup(x);
}
inline void work(int u,int v,int k){
    int x=top[u],y=top[v];
    while(x!=y){
        if(deep[x]<deep[y]){
            swap(x,y);
            swap(u,v);
        }
        add(1,1,n,tid[u],tid[x],k);
        u=fa[x];x=top[u];
    }
    if(u==v)add(1,1,n,tid[u],tid[u],k);
    else {
        if(deep[u]<deep[v])swap(u,v);
        add(1,1,n,tid[u],tid[v],k);
    }
}
inline void ask(int u,int v){
    int x=top[u],y=top[v];
    while(x!=y){
        if(deep[x]<deep[y]){
            swap(u,v);
            swap(x,y);
        }
        query(1,1,n,tid[x],tid[u]);
        u=fa[x];x=top[u];
    }
    if(u==v)query(1,1,n,tid[u],tid[u]);
    else{
        if(deep[u]<deep[v])swap(u,v);
        query(1,1,n,tid[u],tid[v]);
    }
}
template <typename T> void read(T &x){
    x=0;char c=getchar();
    for(;!isdigit(c);c=getchar());
    for(;isdigit(c);c=getchar())x=x*10+c-'0';
}
int main(){
    read(n);read(m);
    for(Ri i=1;i<=n;i++){
        read(a[i].val);
    }
    int u,v,d,flag;
    for(Ri i=1;i<n;i++){
        read(u);read(v);
        Add(u,v);
        Add(v,u);
    }
    deep[1]=1;
    fdfs(1);
    sdfs(1,1);
    build(1,1,n);
    for(Ri i=1;i<=m;i++){
        read(flag);
        if(flag==3){
            ans=0;
            read(u);
            ask(u,1);
            printf("%lld\n",ans);
        }
        if(flag==2){
            read(u);scanf("%d",&d);
            add(1,1,n,tid[u],maxson[u],d);
        }
        if(flag==1){
            read(u);scanf("%d",&d);
            add(1,1,n,tid[u],tid[u],d);
        }
    }
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...