同一份代码:
有没有dalao解释一下
代码贴在下面了
#include<bits/stdc++.h>
#define M 200001
#define ls p<<1
#define rs p<<1|1
#define inf 0x3f3f3f3f
using namespace std;
inline int read()
{
int k=0,f=0;char c=getchar();
for(;!isdigit(c);c=getchar()) f|=c=='-';
for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
return f?-k:k;
}
int n,m,h[M],cnt,res,a[M],b[M];
int fa[M],siz[M],dep[M],son[M],son_edge[M],top[M],idx[M],cost[M];
string s;
struct edge
{
int to,ne,val;
}w[M<<1];
struct tree
{
int val,maxx,minn,tag;
}t[M<<2];
void add(int u,int v,int val)
{
cnt++;
w[cnt].to=v,w[cnt].val=val,w[cnt].ne=h[u],h[u]=cnt;
}
void dfs1(int father,int x)
{
fa[x]=father,siz[x]=1,dep[x]=dep[father]+1;
for(int i=h[x];i;i=w[i].ne)
{
int y=w[i].to;
if(y!=father)
{
dfs1(x,y);
siz[x]+=siz[y];
if(!son[x]||siz[y]>siz[son[x]]) son[x]=y,son_edge[x]=i;
}
}
}
void dfs2(int topx,int x,int num)
{
res++;
idx[x]=res,top[x]=topx,cost[res]=w[num].val;
if(!son[x]) return;
dfs2(topx,son[x],son_edge[x]);
for(int i=h[x];i;i=w[i].ne)
{
int y=w[i].to;
if(y!=son[x]&&y!=fa[x]) dfs2(y,y,i);
}
}
void dispose(int p)
{
int maxx=t[p].maxx,minn=t[p].minn;
t[p].maxx=-minn,t[p].minn=-maxx,t[p].val=-t[p].val;
t[p].tag=!t[p].tag;
return;
}
void push_up(int p)
{
t[p].maxx=max(t[ls].maxx,t[rs].maxx);
t[p].minn=min(t[ls].minn,t[rs].minn);
t[p].val=t[ls].val+t[rs].val;
}
void push_down(int p)
{
if(t[p].tag)
{
dispose(ls),dispose(rs);
t[p].tag=0;
}
}
void build(int p,int l,int r)
{
if(l==r)
{
t[p].val=t[p].maxx=t[p].minn=cost[l];
return;
}
int mid=(l+r)>>1;
build(ls,l,mid),build(rs,mid+1,r);
push_up(p);
}
void update_change(int p,int l,int r,int x,int w)
{
if(l==r)
{
t[p].val=t[p].maxx=t[p].minn=w;
t[p].tag=0;
return;
}
push_down(p);
int mid=(l+r)>>1;
if(x<=mid) update_change(ls,l,mid,x,w);
else update_change(rs,mid+1,r,x,w);
push_up(p);
}
void update_opposite(int p,int l,int r,int st,int en)
{
if(st<=l&&r<=en)
{
dispose(p);
return;
}
push_down(p);
int mid=(l+r)>>1;
if(st<=mid) update_opposite(ls,l,mid,st,en);
if(en>mid) update_opposite(rs,mid+1,r,st,en);
push_up(p);
}
int query_val(int p,int l,int r,int st,int en)
{
if(st<=l&&r<=en) return t[p].val;
push_down(p);
int mid=(l+r)>>1,tot=0;
if(st<=mid) tot+=query_val(ls,l,mid,st,en);
if(en>mid) tot+=query_val(rs,mid+1,r,st,en);
return tot;
}
int query_max(int p,int l,int r,int st,int en)
{
if(st<=l&&r<=en) return t[p].maxx;
push_down(p);
int mid=(l+r)>>1,MAX=-inf;
if(st<=mid) MAX=max(MAX,query_max(ls,l,mid,st,en));
if(en>mid) MAX=max(MAX,query_max(rs,mid+1,r,st,en));
return MAX;
}
int query_min(int p,int l,int r,int st,int en)
{
if(st<=l&&r<=en) return t[p].minn;
push_down(p);
int mid=(l+r)>>1,MIN=inf;
if(st<=mid) MIN=min(MIN,query_min(ls,l,mid,st,en));
if(en>mid) MIN=min(MIN,query_min(rs,mid+1,r,st,en));
return MIN;
}
int LCA(int x,int y,int k)
{
int ans=0,MAX=-inf,MIN=inf;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
if(k==0) update_opposite(1,1,n,idx[top[x]],idx[x]);
else if(k==1) ans+=query_val(1,1,n,idx[top[x]],idx[x]);
else if(k==2) MAX=max(MAX,query_max(1,1,n,idx[top[x]],idx[x]));
else MIN=min(MIN,query_min(1,1,n,idx[top[x]],idx[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(idx[x]+1<=idx[y])
{
if(k==0) update_opposite(1,1,n,idx[x]+1,idx[y]);
else if(k==1) ans+=query_val(1,1,n,idx[x]+1,idx[y]);
else if(k==2) MAX=max(MAX,query_max(1,1,n,idx[x]+1,idx[y]));
else MIN=min(MIN,query_min(1,1,n,idx[x]+1,idx[y]));
}
if(k==1) return ans;
else if(k==2) return MAX;
else if(k==3) return MIN;
}
int get(int i)
{
return dep[a[i]]>dep[b[i]]?a[i]:b[i];
}
int main()
{
n=read();
for(int i=1;i<n;i++)
{
int u=read()+1,v=read()+1,val=read();
a[i]=u,b[i]=v;
add(u,v,val),add(v,u,val);
}
dfs1(0,1);
dfs2(1,1,0);
build(1,1,n);
m=read();
while(m--)
{
cin>>s;
int x=read()+1,y=read()+1;
if(s=="C") update_change(1,1,n,idx[get(x-1)],y-1);
else if(s=="N") LCA(x,y,0);
else if(s=="SUM") printf("%d\n",LCA(x,y,1));
else if(s=="MAX") printf("%d\n",LCA(x,y,2));
else if(s=="MIN") printf("%d\n",LCA(x,y,3));
}
return 0;
}