铁锤 @ 2019-08-11 13:56:39
MLE 4+RE 6
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ans=0;
char last=' ',ch=getchar();
while(ch<'0'||ch>'9') last=ch,ch=getchar();
while(ch>='0'&&ch<'9') ans=(ans<<1)+(ans<<3)+ch-'0',ch=getchar();
if(last=='-') ans=-ans;
return ans;
}
const int mxm=200005;
const int mxn=100005;
int n;
int ecnt,cnt;
int head[mxn],dep[mxn],top[mxn];
int son[mxn],size[mxn],fat[mxn];
int dfn[mxn],tr[mxm<<2],sum[mxn];
struct Node{
int u,v,w;
}e[mxm];
struct edge{
int to,nxt;
}ed[mxm];
void add(int from,int to){
++ecnt;
ed[ecnt].to=to;
ed[ecnt].nxt=head[from];
head[from]=ecnt;
}
void dfs1(int u,int fa){
dep[u]=dep[fa]+1;
size[u]=1;
fat[u]=fa;
int v,sum=0;
for(int i=head[u];i;i=ed[i].nxt){
v=ed[i].to;
if(v!=fa){
dfs1(v,u);
size[u]+=size[v];
if(size[v]>sum) sum=size[v],son[u]=v;
}
}
}
void dfs2(int u,int fa){
dfn[u]=++cnt;
if(son[fa]==u) top[u]=top[fa];
else top[u]=u;
if(son[u]) dfs2(son[u],u);
for(int i=head[u],v;i;i=ed[i].nxt){
v=ed[i].to;
if(v!=fa&&v!=son[u])
dfs2(v,u);
}
}
void build(int k,int l,int r){
if(l==r) {
tr[k]=sum[l];
return;
}
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
tr[k]=max(tr[k<<1],tr[k<<1|1]);
}
void change(int k,int l,int r,int p,int c){
if(l==r){
tr[k]=c;
return;
}
int mid=l+r>>1;
if(mid>=p) change(k<<1,l,mid,p,c);
else change(k<<1|1,mid+1,r,p,c);
tr[k]=max(tr[k<<1],tr[k<<1|1]);
}
int query(int k,int l,int r,int x,int y){
if(x>y) return 0;
if(l>=x&&r<=y)
return tr[k];
int mid=l+r>>1;
int ans=0;
if(x<=mid) ans=max(ans,query(k<<1,l,mid,x,y));
if(y>mid) ans=max(ans,query(k<<1|1,mid+1,r,x,y));
return ans;
//have question!!
}
int getans(int a,int b){
int ret=0;
while(top[a]!=top[b]){
int ta=top[a];
int tb=top[b];
if(dep[ta]<dep[tb]) ret=max(ret,query(1,1,n,dfn[tb],dfn[b])),b=fat[tb];
else ret=max(ret,query(1,1,n,dfn[ta],dfn[a])),a=fat[ta];
}
if(dep[a]<dep[b]) swap(a,b);
ret=max(ret,query(1,1,n,dfn[b]+1,dfn[a]));
return ret;
}
int main(){
n=read();
int u,v,w;
for(int i=1;i<n;i++){
u=read();v=read();w=read();
e[i].u=u;e[i].v=v;e[i].w=w;
add(u,v);add(v,u);
}
dfs1(1,0);
dfs2(1,0);
sum[1]=0;
for(int i=1;i<n;i++){
if(dep[e[i].u]>dep[e[i].v]) sum[dfn[e[i].u]]=e[i].w;
else sum[dfn[e[i].v]]=e[i].w;
}
build(1,1,n);
char s[20];
int i,it,a,b;
while(1){
scanf("%s",s);
if(s[0]=='D') break;
if(s[0]=='C'){
i=read();
it=read();
if(dep[e[i].u]>dep[e[i].v])
change(1,1,n,dfn[e[i].u],it);
else
change(1,1,n,dfn[e[i].v],it);
}
if(s[0]=='Q'){
a=read();
b=read();
printf("%d\n",getans(a,b));
}
}
return 0;
}
by 一个大帅哥 @ 2019-08-11 14:02:42
本人不是大佬看不懂
by Lstdo @ 2019-08-11 14:04:37
@铁锤 询问要特判一个点
by wudiss8 @ 2019-08-11 14:06:22
@铁锤 年少不知号重要
by wudiss8 @ 2019-08-11 14:06:39
@铁锤 好像要开LONG LONG 的
by 铁锤 @ 2019-08-11 14:06:44
@Lstdo 哦,大佬,应该怎么改
by Lstdo @ 2019-08-11 14:08:05
@铁锤 getans的时候
if (a==b) return 0;
by 铁锤 @ 2019-08-11 14:08:28
@Lstdo 行
by 铁锤 @ 2019-08-11 14:08:47
可是mle和re是怎么回事啊
by Lstdo @ 2019-08-11 14:09:52
@铁锤 不对你判了的 当我没说(逃
by optimize_3 @ 2019-08-11 14:14:04
@chen_zhe