树剖 80分 wa1和3 求助
查看原帖
树剖 80分 wa1和3 求助
647260
X1195160770楼主2023/1/12 23:20
#include<bits/stdc++.h>
#define db  long double
#define lowbit(x) x&-x
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=4e5+10,mod=998244353;
void fast(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);}
ll n,x,y,m;
ll a[N],b[N];
ll dep[N],sz[N],hson[N],fa[N],top[N],dfsn[N],id[N];
vector<int> g[N];
struct node{
    int l;
    int r;
    ll sum;
    ll maxn;
}tr[N*4];

void pushup(int u){
    tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
    tr[u].maxn=max(tr[u<<1].maxn,tr[u<<1|1].maxn);
}

void build(int u,int l,int r){
	tr[u].l=l,tr[u].r=r;
	if(l==r){
        tr[u].sum=b[l];
        tr[u].maxn=b[l];
		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 x,ll v){
    if(tr[u].l==tr[u].r){
        tr[u].sum=tr[u].maxn=v;
        return;
    }
    int mid=tr[u].l+tr[u].r>>1;
    if(x<=mid) modify(u<<1,x,v);
    else modify(u<<1|1,x,v);
    pushup(u);
}

ll query_max(int u,int l,int r){
    if(tr[u].l>=l&&tr[u].r<=r)
        return tr[u].maxn;
    int mid=tr[u].l+tr[u].r>>1;
    ll ans=-1e18;
    if(l<=mid) ans=max(ans,query_max(u<<1,l,r)); 
    if(r>mid) ans=max(ans,query_max(u<<1|1,l,r));
    return ans; 
}

ll query_sum(int u,int l,int r){
    if(tr[u].l>=l&&tr[u].r<=r)
        return tr[u].sum;
    int mid=tr[u].l+tr[u].r>>1;
    ll ans=0;
    if(l<=mid) ans+=query_sum(u<<1,l,r);
    if(r>mid) ans+=query_sum(u<<1|1,l,r);
    return ans; 
}

int cnt=0;
void dfs1(int u){
    sz[u]=1;
    hson[u]=0;
    for(auto x:g[u]){
        if(x==fa[u]) continue;
        dep[x]=dep[u]+1;
        fa[x]=u;
        dfs1(x);
        sz[u]+=sz[x];
        if(sz[hson[u]]<sz[x]) hson[u]=x;
    }
}

void dfs2(int u,int t){
    dfsn[u]=++cnt;
    top[u]=t;
    if(hson[u])
        dfs2(hson[u],t);
    for(auto x:g[u]){
        if(x==hson[u]||x==fa[u]) continue;
        dfs2(x,x);
    }
}

ll query_pathsum(int a,int b){
    ll ans=0;
    while(top[a]!=top[b]){
        if(dep[top[a]<dep[top[b]]]) swap(a,b);
        ans=(ans+query_sum(1,dfsn[top[a]],dfsn[a]));
        a=fa[top[a]];
    }
    if(dep[a]>dep[b]) swap(a,b);
    ans=(ans+query_sum(1,dfsn[a],dfsn[b]));
    return ans;
}

ll query_pathmax(int a,int b){
    ll ans=-1e18;
    while(top[a]!=top[b]){
        if(dep[top[a]<dep[top[b]]]) swap(a,b);
        ans=max(ans,query_max(1,dfsn[top[a]],dfsn[a]));
        a=fa[top[a]];
    }
    if(dep[a]>dep[b]) swap(a,b);
    ans=max(ans,query_max(1,dfsn[a],dfsn[b]));
    return ans;
}
int main(){
    cin>>n;
    for(int i=1;i<n;i++){
        cin>>x>>y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    for(int i=1;i<=n;i++) cin>>a[i];
    dep[1]=1,fa[1]=1,top[1]=1;
    dfs1(1);
    dfs2(1,1);
    for(int i=1;i<=n;i++) b[dfsn[i]]=a[i];
    build(1,1,n);
    cin>>m;
    string op;
    for(int i=1;i<=m;i++){
        cin>>op>>x>>y;
        if(op=="CHANGE") modify(1,dfsn[x],y);
        else if(op=="QMAX") cout<<query_pathmax(x,y)<<endl;
        else cout<<query_pathsum(x,y)<<endl;
    }
}
2023/1/12 23:20
加载中...