洛谷加油 @ 2020-02-13 15:00:13
#include<bits/stdc++.h>
using namespace std;
int n,a[100005],p1[100005],p2[100005];
vector<int>g[100005],g2[100005],g3[100005];
int dep[10005],fa[100005],w[100005],vist[100005],sn[100005];
int lt[100005],lf[100005],st[100005],en[100005],tot;
long long sm[400005],lz[400005],sm2[400005];
void dfs1(int x)
{
w[x]=1;
for(int i=0;i<g[x].size();i++)
{
int cu=g[x][i];
fa[cu]=x;
dep[cu]=dep[x]+1;
dfs1(cu);
w[x]+=w[cu];
}
}
void dfs2(int x)
{
st[x]=tot++;
if(!g[x].size())return;
int flag=0,zh=0;
for(int i=0;i<g[x].size();i++)if(w[g[x][i]]>zh)zh=w[g[x][i]],sn[x]=g[x][i];
for(int i=0;i<g[x].size();i++)if(flag==0&&w[g[x][i]]==zh)
{
flag=1;
lt[x]=g[x][i];
lf[g[x][i]]=lf[x];
dfs2(g[x][i]);
}
for(int i=0;i<g[x].size();i++)if(g[x][i]!=lt[x])
{
lf[g[x][i]]=g[x][i];
dfs2(g[x][i]);
}
en[x]=tot;
}
void add(int l,int r,int o,int ll,int rr,int oo)
{
if(l>=ll&&r<=rr)
{
lz[o]=(lz[o]+oo);
sm[o]=(sm[o]+1ll*(r-l+1)*oo);
sm2[o]=(sm2[o]+oo);
return;
}
int mid=l+r>>1;
lz[o<<1]=(lz[o<<1]+lz[o]);
lz[o<<1|1]=(lz[o<<1|1]+lz[o]);
sm[o<<1]=(sm[o<<1]+1ll*(mid-l+1)*lz[o]);
sm[o<<1|1]=(sm[o<<1|1]+1ll*(r-mid)*lz[o]);
sm2[o<<1]+=lz[o];
sm2[o<<1|1]+=lz[o];
lz[o]=0;
if(mid>=ll)add(l,mid,o<<1,ll,rr,oo);
if(mid<rr)add(mid+1,r,o<<1|1,ll,rr,oo);
sm[o]=(sm[o<<1]+sm[o<<1|1]);
sm2[o]=max(sm2[o<<1],sm2[o<<1|1]);
}
int query(int l,int r,int o,int ll,int rr)
{
if(l>=ll&&r<=rr)return sm2[o];
int mid=l+r>>1;
lz[o<<1]=(lz[o<<1]+lz[o]);
lz[o<<1|1]=(lz[o<<1|1]+lz[o]);
sm[o<<1]=(sm[o<<1]+1ll*(mid-l+1)*lz[o]);
sm[o<<1|1]=(sm[o<<1|1]+1ll*(r-mid)*lz[o]);
sm2[o<<1]+=lz[o];
sm2[o<<1|1]+=lz[o];
lz[o]=0;
int ans=-2147483647;
if(mid>=ll)ans=max(ans,query(l,mid,o<<1,ll,rr));
if(mid<rr)ans=max(ans,query(mid+1,r,o<<1|1,ll,rr));
return ans;
}
void dfs(int x)
{
vist[x]=1;
for(int i=0;i<g2[x].size();i++)
{
int cu=g2[x][i];
if(vist[cu])continue;
g[x].push_back(cu);
a[cu]=g3[x][i];
dfs(cu);
}
}
int main()
{
// freopen("444.in","r",stdin);
// freopen("444.out","w",stdout);
cin>>n;
for(int i=1;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
g2[u].push_back(v);
g2[v].push_back(u);
g3[u].push_back(w);
g3[v].push_back(w);
p1[i]=u,p2[i]=v;
}
dfs(1);
dfs1(1);
dfs2(1);
for(int i=2;i<=n;i++)add(1,n,1,st[i],st[i],a[i]);
char s[105]={0};
scanf("%s",s);
while(s[0]!='D')
{
if(s[0]=='C')
{
int p,t;
scanf("%d%d",&p,&t);
if(fa[p1[p]]==p2[p])
{
add(1,n,1,st[p1[p]],st[p1[p]],t-query(1,n,1,st[p1[p]],st[p1[p]]));
}else
{
add(1,n,1,st[p2[p]],st[p2[p]],t-query(1,n,1,st[p2[p]],st[p2[p]]));
}
}else
{
int x,y;
scanf("%d%d",&x,&y);
int ans=0;
while(lf[x]!=lf[y]&&x&&y)
{
if(dep[lf[x]]>dep[lf[y]])swap(x,y);
ans=max(ans,query(1,n,1,st[lf[y]]+1,st[y]));
y=fa[lf[y]];
}
if(dep[x]>dep[y])swap(x,y);
if(x&&y&&x!=y)ans=max(ans,query(1,n,1,st[x]+1,st[y]));
printf("%d\n",ans);
}
scanf("%s",s);
}
return 0;
}
by xzy062609 @ 2020-02-13 15:04:11
有毒
QWQ
能
不
能
别
这
样
by xh39 @ 2020-02-13 15:18:43
1
+
1
我
也
不
会
。
。
。
我
帮
不
了
。
。
。