bellmanford @ 2019-10-07 09:06:41
只有70分QAQ
#include<iostream>
#include<cstdio>
using namespace std;
const int M=3e5+5;
int n,cnt=0,a[M],de[M],fa[M],son[M],top[M],num[M],pre[M],size[M];
int tot=0,first[M];
struct Edge{
int nxt,to,val;
}e[M<<1];
struct Tree{
int maxn;
}tr[M<<2];
struct CuCun{
int x,y,z;
}c[M];
int read(){
int x=0,y=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') y=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*y;
}
void add(int x,int y,int z){
tot++;
e[tot].nxt=first[x];
first[x]=tot;
e[tot].to=y;
e[tot].val=z;
}
void dfs1(int u,int f){
fa[u]=f;
de[u]=de[f]+1;
size[u]=1;
for(int i=first[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].val;
if(v==f) continue;
a[v]=w;
dfs1(v,u);
size[u]+=size[v];
if(size[son[u]]<size[v]) son[u]=v;
}
}
void dfs2(int u,int tp){
num[u]=++cnt;
pre[cnt]=u;
top[u]=tp;
if(son[u]) dfs2(son[u],tp);
for(int i=first[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
}
void pushup(int u){
tr[u].maxn=max(tr[u<<1].maxn,tr[u<<1|1].maxn);
}
void build(int u,int l,int r){
if(l==r){
tr[u].maxn=a[pre[l]];
return ;
}
int mid=(l+r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void change(int u,int l,int r,int x,int d){
if(l==r&&l==x){
tr[u].maxn=d;
return ;
}
int mid=(l+r)>>1;
if(x<=mid) change(u<<1,l,mid,x,d);
else change(u<<1|1,mid+1,r,x,d);
pushup(u);
}
int query_max(int u,int l,int r,int L,int R){
if(L>r||R<l) return -1<<30;
if(L<=l&&R>=r) return tr[u].maxn;
int mid=(l+r)>>1;
return max(query_max(u<<1,l,mid,L,R),query_max(u<<1|1,mid+1,r,L,R));
}
int qmax(int x,int y){
int ans=-1<<30;
while(top[x]!=top[y]){
if(de[top[x]]<de[top[y]]) swap(x,y);
ans=max(ans,query_max(1,1,n,num[top[x]],num[x]));
x=fa[top[x]];
}
if(de[x]<de[y]) swap(x,y);
ans=max(ans,query_max(1,1,n,num[y]+1,num[x]));
return ans;
}
int main(){
n=read();
for(int i=1;i<=n-1;i++){
int x=read(),y=read(),z=read();
add(x,y,z),add(y,x,z);
c[i].x=x,c[i].y=y,c[i].z=z;
}
a[1]=-1<<30;
dfs1(1,1);
dfs2(1,1);
build(1,1,n);
// for(int i=1;i<=n;i++) printf("%d ",a[pre[i]]);
// printf("\n");
char s[15];
while(1){
scanf("%s",s);
if(s[0]=='D') break;
int x=read(),y=read();
if(s[0]=='Q') printf("%d\n",qmax(x,y));
if(s[0]=='C'){
int u=c[x].x,v=c[x].y;
if(fa[v]==u) swap(u,v);
change(1,1,n,num[u],y);
}
}
}
by 梧桐灯 @ 2019-10-07 09:10:19
查询的点相同时输出0
by bellmanford @ 2019-10-07 09:15:48
@光随影走 太感谢了