性感树剖在线求调教
查看原帖
性感树剖在线求调教
246331
mystic_qwq楼主2024/8/24 10:39
#include<bits/stdc++.h>
using namespace std;
#define int  long long
const int N=3e4+10;
int n,a,b,q,w[N],dfn[N],tot,fa[N],tp[N],son[N],sz[N],t[N<<2],t1[N<<2],dep[N];vector<int>G[N];
void dfs1(int u){
  sz[u]=1;for(int v:G[u])if(v^fa[u])
  fa[v]=u,dep[v]=dep[u]+1,dfs1(v),sz[v]+=sz[u],sz[son[u]]<sz[v]&&(son[u]=v);
}
void dfs2(int u,int x){
  dfn[u]=++tot;
  tp[u]=x; if(!son[u]) return;
  dfs2(son[u],x); for(int v:G[u])if(v!=fa[u]&&v!=son[u])dfs2(v,v);
}
#define tr int h,int l,int r
#define mid (l+r>>1)
#define ls h*2
#define rs ls|1
#define lson ls,l,mid
#define rson rs,mid+1,r
#define pushup(h) t[h]=t[ls]+t[rs],t1[h]=max(t1[ls],t1[rs])
void build(tr){
  if(l==r) t[h]=w[l],t1[h]=w[l];
  else build(lson),build(rson),pushup(h);
}
void modify(tr,int x,int y){
  if(l==r) t[h]=y,t1[h]=y;
  else {
    if(x<=mid) modify(lson,x,y);
    else modify(rson,x,y);
    pushup(h);
  }
}
int query(tr,int x,int y,bool z){
  if(x<=l&&r<=y) return z?t[h]:t1[h];
  if(y<=mid) return query(lson,x,y,z);
  if(x>mid) return query(rson,x,y,z);
  if(z) return query(lson,x,y,z)+query(rson,x,y,z);
  return max(query(lson,x,y,z),query(rson,x,y,z));
}
int qchain(int u,int v,bool z){
  int ans=0;
  for(;tp[u]!=tp[v];u=fa[tp[u]]){
    if(dep[tp[u]]<dep[tp[v]]) swap(u,v);
    if(z) ans+=query(1,1,n,dfn[tp[u]],dfn[u],z);
    else ans=max(ans,query(1,1,n,dfn[tp[u]],dfn[u],z));
  }
  if(dep[u]<dep[v]) swap(u,v);
  if(z) ans+=query(1,1,n,dfn[v],dfn[u],z);
  else ans=max(ans,query(1,1,n,dfn[v],dfn[u],z));
  return ans;
}
main(){
  cin.tie(0)->sync_with_stdio(0);
  cin>>n;
  for(int i=1,u,v;i<n;++i) cin>>u>>v,G[u].push_back(v),G[v].push_back(u);
  for(int i=1;i<=n;++i) cin>>w[i];
  dfs1(1),dfs2(1,1),build(1,1,n);
  cin>>q;while(q--){string s;int u,v;cin>>s>>u>>v;if(s[0]=='C')modify(1,1,n,u,v);else if(s[1]=='M')cout<<qchain(u,v,0)<<'\n';else cout<<qchain(u,v,1)<<'\n';}
}
2024/8/24 10:39
加载中...