社区讨论
求助MLE
P4114Qtree1参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo1unclf
- 此快照首次捕获于
- 2023/10/23 03:16 2 年前
- 此快照最后确认于
- 2023/11/03 03:47 2 年前
只A了1个点
CPP#include<bits/stdc++.h>
using namespace std;
int t,n,cnt,s[100010],pre[100010],m,cnt1,dep[100010],f[100010],siz[100010];
int tree[400010],son[100010],top[100010],id[100010],head[100010],val[100010];
string st;
struct nodd{
int to,nxt,val;
}edge[200010];
struct node{
int u,v;
}a[200010];
void add(int u,int v,int w){
edge[++cnt].to=v;
edge[cnt].nxt=head[u];
edge[cnt].val=w;
head[u]=cnt;
}
void dfs1(int now,int fa){
dep[now]=dep[fa]+1;
siz[now]=1;
f[now]=fa;
for(int i=head[now];i;i=edge[i].nxt){
int v=edge[i].to;
if(v==fa)continue;
dfs1(v,now);
val[v]=edge[i].val;
siz[now]+=siz[v];
if(siz[v]>siz[son[now]])son[now]=v;
}
}
void dfs2(int now,int tp){
top[now]=tp;
id[now]=++cnt1;
pre[cnt1]=now;
if(son[now])dfs2(son[now],tp);
for(int i=head[now];i;i=edge[i].nxt){
int v=edge[i].to;
if(v==f[now]||v==son[now])continue;
dfs2(v,v);
}
}
void pushup(int o){
tree[o]=max(tree[o*2],tree[o*2+1]);
}
void build(int o,int l,int r){
if(l==r){
tree[o]=val[pre[l]];
return;
}
int mid=(l+r)>>1;
build(o*2,l,mid);
build(o*2+1,mid+1,r);
pushup(o);
}
void change(int o,int l,int r,int pos,int v){
if(l==r){
tree[o]=v;
return;
}
int mid=(l+r)>>1;
if(pos<=mid)change(o*2,l,mid,pos,v);
else change(o*2+1,mid+1,r,pos,v);
pushup(o);
}
int query1(int o,int l,int r,int L,int R){
if(L<=l&&r<=R)return tree[o];
int mid=(l+r)>>1;
int ans=0;
if(L<=mid)ans=max(ans,query1(o*2,l,mid,L,R));
if(R>mid)ans=max(ans,query1(o*2+1,mid+1,r,L,R));
return ans;
}
int query(int u,int v){
if(u==v)return 0;
int ans=0;
while(top[u]!=top[v]){
if(dep[u]<dep[v])swap(u,v);
ans=max(ans,query1(1,1,n,id[top[u]],id[u]));
u=f[top[u]];
}
if(dep[u]>dep[v])swap(u,v);
ans=max(ans,query1(1,1,n,id[u]+1,id[v]));
return ans;
}
signed main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
a[i].u=u,a[i].v=v;
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
while(cin>>st&&st!="DONE"){
if(st=="CHANGE"){
int x,y;
scanf("%d%d",&x,&y);
int u=a[x].u,v=a[x].v;
if(v==f[u])swap(u,v);
change(1,1,n,id[v],y);
}
else{
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",query(u,v));
}
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...