树剖只过 #5 #6 求调
查看原帖
树剖只过 #5 #6 求调
923947
_sunkuangzheng_楼主2023/7/21 11:46

rt,看了下讨论区好像没有在修改操作传参的时候错 /kk

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 5e5+5;
struct edge{int to,nxt;}e[maxn];int head[maxn],cnt,u,v,q;string s;
void add(int u,int v){e[++cnt].to = v,e[cnt].nxt = head[u],head[u] = cnt;}
int dep[maxn],siz[maxn],son[maxn],id[maxn],fa[maxn],top[maxn],tot,t1[maxn],t2[maxn],n,a[maxn];
void update(int s,int l,int r,int x,int k){
    int mid = (l + r) / 2;
    if(l == r) {t1[s] = k,t2[s] = k;return ;}
    if(x <= mid) update(s*2,l,mid,x,k); else update(s*2+1,mid+1,r,x,k);
    t1[s] = t1[s*2] + t1[s*2+1],t2[s] = max(t2[s*2],t2[s*2+1]);
}
int query1(int s,int l,int r,int ql,int qr){
    int mid = (l + r) / 2,ans = 0;
    if(ql <= l && r <= qr) return t1[s];
    if(ql <= mid) ans += query1(s*2,l,mid,ql,qr);
    if(qr >= mid+1) ans += query1(s*2+1,mid+1,r,ql,qr);
    return ans;
}
int query2(int s,int l,int r,int ql,int qr){
    int mid = (l + r) / 2,ans = -1e9;
    if(ql <= l && r <= qr) return t2[s];
    if(ql <= mid) ans = max(ans,query2(s*2,l,mid,ql,qr));
    if(qr >= mid+1) ans = max(ans,query2(s*2+1,mid+1,r,ql,qr));
    return ans;
}
void dfs1(int u,int fat){
    fa[u] = fat,dep[u] = dep[fat] + 1,siz[u] = 1;
    for(int i = head[u];i;i = e[i].nxt){
        int v = e[i].to;if(v == fat) continue;
        dfs1(v,u),siz[u] += siz[v];if(siz[v] > siz[son[u]]) son[u] = v;
    }
}
void dfs2(int u,int tp){
    id[u] = ++tot,top[u] = tp,update(1,1,n,tot,a[u]);
    if(son[u]) dfs2(son[u],tp);
    for(int i = head[u];i;i = e[i].nxt){
        int v = e[i].to;if(v == fa[u] || v == son[u]) continue;
        dfs2(v,v);
    }
}
int query3(int u,int v){
    int ans = 0;
    while(top[u] != top[v]){
        if(dep[top[u]] < dep[top[v]]) swap(u,v);
        ans += query1(1,1,n,id[top[u]],id[u]),u = fa[top[u]];
    }
    if(dep[u] > dep[v]) swap(u,v);
    return ans + query1(1,1,n,id[u],id[v]);
}
int query4(int u,int v){
    int ans = -1e9;
    while(top[u] != top[v]){
        if(dep[top[u]] < dep[top[v]]) swap(u,v);
        ans = max(ans,query2(1,1,n,id[top[u]],id[u])),u = fa[top[u]];
    }
    if(dep[u] > dep[v]) swap(u,v);
    return max(ans,query2(1,1,n,id[u],id[v]));
}
signed main(){
    cin >> n;
    for(int i = 1;i < n;i ++) cin >> u >> v,add(u,v),add(v,u);
    for(int i = 1;i <= n;i ++) cin >> a[i];cin >> q;
    for(int i = 1;i <= n*4;i ++) t2[i] = -1e9;
    dfs1(1,0),dfs2(1,1);
    while(q --){
        cin >> s >> u >> v;
        if(s[0] == 'C') update(1,1,n,id[u],v);
        else if(s[0] == 'Q' && s[1] == 'M') cout << query4(id[u],id[v]) << "\n";
        else cout << query3(id[u],id[v]) << "\n";
    }
    return 0;
}
2023/7/21 11:46
加载中...