#include<bits/stdc++.h>
using namespace std;
#define debug(x) cerr<<#x<<' '<<x<<endl
#ifndef ONLINE_JUDGE
#define fuck getchar
#else
#define fuck getchar
#endif
char nc(){
static char buf[1<<25],*p=buf,*q=buf;
if(p==q&&(q=(p=buf)+fread(buf,1,1<<25,stdin),p==q))return EOF;
return *p++;
}
template<class T>void read(T&x){
short f=1;x=0;
char ch=fuck();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=fuck();
}while(isdigit(ch)){
x=(x<<1)+(x<<3)+(ch^48);
ch=fuck();
}x*=f;
}
template<class T>void write(T x){
if(x<0)putchar('-'),x=-x;
if(x>=10)write(x/10);
putchar(x%10+48);
}
#define maxn 100010
int n,x,y,z;
char op[10];
struct point{
int l,r;
mutable int v;
point(int ll,int rr,int vv):l(ll),r(rr),v(vv) {}
inline bool operator<(point x)const{return l<x.l;}
};
set<point>s;
#define Iter set<point>::iterator
Iter split(int x){
if(x>n)return s.end();
Iter it=--s.upper_bound(point(x,0,0));
if(it->l==x)return it;
int l=it->l,r=it->r,v=it->v;
s.erase(it);
s.insert(point(l,x-1,v));
return s.insert(point(x,r,v)).first;
}
void ASSIGN(int l,int r,int v){
Iter itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(point(l,r,v));
}
int MAX(int l,int r){
Iter itr=split(r+1),itl=split(l);
int ans=0;
for(;itl!=itr;++itl)ans=max(ans,itl->v);
return ans;
}
void ADD(int l,int r,int v){
Iter itr=split(r+1),itl=split(l);
for(;itl!=itr;++itl)itl->v+=v;
}
int head[maxn],Next[maxn<<1],ver[maxn<<1],edge[maxn<<1],tot=1;
void add(int x,int y,int z){
ver[++tot]=y;
edge[tot]=z;
Next[tot]=head[x];
head[x]=tot;
}
int dep[maxn],fa[maxn],siz[maxn],son[maxn],top[maxn],dfn[maxn],cnt;
void dfs1(int x){
siz[x]=1;
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(dep[y])continue;
dep[y]=dep[x]+1;
fa[y]=x;
dfs1(y);
siz[x]+=siz[y];
if(siz[y]>siz[son[x]])son[x]=y;
}
}
void dfs2(int x,int t){
dfn[x]=++cnt;
top[x]=t;
if(!son[x])return;
dfs2(son[x],t);
for(int i=head[x];i;i=Next[i])
if(ver[i]!=fa[x]&&ver[i]!=son[x])dfs2(ver[i],ver[i]);
}
void modify(int x,int y,int z){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ASSIGN(dfn[top[x]],dfn[x],z);
x=fa[top[x]];
}
if(x==y)return;
if(dep[x]>dep[y])swap(x,y);
ASSIGN(dfn[son[x]],dfn[y],z);
}
void Modify(int x,int y,int z){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ADD(dfn[top[x]],dfn[x],z);
x=fa[top[x]];
}
if(x==y)return;
if(dep[x]>dep[y])swap(x,y);
ADD(dfn[son[x]],dfn[y],z);
}
int ask(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans=max(ans,MAX(dfn[top[x]],dfn[x]));
x=fa[top[x]];
}
if(x==y)return ans;
if(dep[x]>dep[y])swap(x,y);
return max(ans,MAX(dfn[son[x]],dfn[y]));
}
int main(){
#ifndef ONLINE_JUDGE
freopen("P4315_1.in","r",stdin);
freopen("Cindy.txt","w",stdout);
#endif
read(n);
for(int i=1;i<n;i++){
read(x),read(y),read(z);
add(x,y,z),add(y,x,z);
}
dep[1]=1;
dfs1(1);
dfs2(1,1);
for(int i=2;i<tot;i+=2){
x=ver[i],y=ver[i^1],z=edge[i];
if(dep[x]<dep[y])swap(x,y);
s.insert(point(dfn[x],dfn[x],z));
}
s.insert(point(1,1,0));
while(scanf("%s",op),op[1]!='t'){
read(x),read(y);
if(op[1]=='h'){
int fx=ver[x<<1],fy=ver[x<<1|1];
if(dep[fx]<dep[fy])swap(fx,fy);
ASSIGN(dfn[fx],dfn[fx],y);
// s.erase(s.lower_bound(point(dfn[fx],dfn[fx],0)));
// s.insert(point(dfn[fx],dfn[fx],y));
}
if(op[1]=='o')read(z),modify(x,y,z);
if(op[1]=='d')read(z),Modify(x,y,z);
if(op[1]=='a')write(ask(x,y)),putchar('\n');
}
}
这是AC代码
其中
ASSIGN(dfn[fx],dfn[fx],y);
// s.erase(s.lower_bound(point(dfn[fx],dfn[fx],0)));
// s.insert(point(dfn[fx],dfn[fx],y));
用这个也会WA
// s.insert(point(dfn[fx],dfn[fx],y));
如果用下面两句就会WA,好奇怪
望珂学大神解答