求调树剖Segmentation fault了
查看原帖
求调树剖Segmentation fault了
315205
Kniqht楼主2022/11/6 19:14

rt,样例就seg了

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=3e4+10,M=N*2;
int n,w[N],m;
int h[N],e[M],ne[M],idx;
int id[N],nw[N],cnt;
int dep[N],sz[N],top[N],fa[N],son[N];
struct Node{
    int l,r;
    ll sum,v;
}tr[N];
void add(int a,int b){e[idx]=b,ne[idx]=h[a],h[a]=idx++;}
void dfs1(int x,int fat,int depth){
    dep[x]=depth,fa[x]=fat,sz[x]=1;
    for(int i=h[x];~i;i=ne[i]){
        int j=e[i];
        if(j==fat) continue;
        dfs1(j,x,depth+1);
        sz[x]+=sz[j];
        if(sz[son[x]]<sz[j]) son[x]=j;
    }
}
void dfs2(int u,int t){
    id[u]=++cnt;nw[cnt]=w[u];top[u]=t;
    if(!son[u]) return;
    dfs2(son[u],t);
    for(int i=h[u];~i;i=ne[i]){
        int j=e[i];
        if(j==fa[u]||j==son[u]) continue;
        dfs2(j,j);
    }
}
void pushup(int u){
    tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
    tr[u].v=max(tr[u<<1].v,tr[u<<1|1].v);
}
void build(int u,int l,int r){
    tr[u]=Node{l,r,nw[r],nw[r]};
    if(l==r) return;
    int mid=l+r>>1;
    build(u<<1,l,mid);build(u<<1|1,mid+1,r);
    pushup(u);
}
void modify(int u,int t,int k){
    if(tr[u].l==t&&tr[u].r==t){
        tr[u].sum=tr[u].v=k;
        return;
    }
    int mid=tr[u].l+tr[u].r>>1;
    if(t<=mid) modify(u<<1,t,k);
    else modify(u<<1|1,t,k);
    pushup(u);
}
ll query(int u,int l,int r,int opt){//opt==1:sum [ else MAX]
    if(l<=tr[u].l&&tr[u].r<=r) return opt?tr[u].sum:tr[u].v;
    int mid=tr[u].l+tr[u].r>>1;ll res=0;
    if(l<=mid) res=query(u<<1,l,r,opt);
    if(r>mid){
        if(res) res+=query(u<<1|1,l,r,opt);
        else res=max(res,query(u<<1|1,l,r,opt));
    }
    return res;
}
ll get_path(int u,int v,int opt){
    ll res=0;
    while(top[u]!=top[v]){
        if(dep[top[u]]<dep[top[v]]) swap(u,v);
        if(opt) res+=query(1,id[top[u]],id[u],opt);
        if(!opt) res=max(res,query(1,id[top[u]],id[u],opt));
        u=fa[top[u]];
    }
    if(dep[u]<dep[v]) swap(u,v);
    if(opt) res+=query(1,id[v],id[u],opt);
    if(!opt) res=max(res,query(1,id[v],id[u],opt));
    return res;
}
char s[10];
int main(){
    memset(h,-1,sizeof(h));
    scanf("%d",&n);int x,y;
    for(int i=1;i<n;i++){
        scanf("%d%d",&x,&y);
        add(x,y);add(y,x);
    }
    for(int i=1;i<=n;i++) scanf("%d",&w[i]);
    dfs1(1,-1,1);dfs2(1,1);build(1,1,n);
    scanf("%d",&m);
    while(m--){
        cin>>s;
        scanf("%d%d",x,y);
        if(s=="QMAX") printf("%lld\n",get_path(x,y,0));
        else if(s=="QSUM") printf("%lld\n",get_path(x,y,1));
        else modify(1,x,y);
    }
    return 0;
}
2022/11/6 19:14
加载中...