社区讨论
真·萌新求助...
P4949最短距离参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mi7xjfkz
- 此快照首次捕获于
- 2025/11/21 05:14 4 个月前
- 此快照最后确认于
- 2025/11/21 05:14 4 个月前
WA80分(2、8两个点)
CPP// luogu-judger-enable-o2
#include<cstdio>
#include<iostream>
#include<cstring>
#define int long long
using namespace std;
inline int read(){
int ans=0,f=1;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-1;chr=getchar();}
while(isdigit(chr)){ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
return ans*f;
}const int M=500010;
int aa[M],bb[M];
int n,m,head[M<<1],ver[M<<1],nxt[M<<1],val[M<<1],tot=1,b[M],idx[M],dep[M],son[M],fa[M],sz[M],ext,frm[M<<1],tp[M],mn[M<<2],a[M],x,y,z,opt;
inline void add(int x,int y,int z){ver[++tot]=y,nxt[tot]=head[x],val[tot]=z,frm[tot]=x,head[x]=tot;}
void dfs1(int x,int f){
dep[x]=dep[f]+1,sz[x]=1;
for(int i=head[x];i;i=nxt[i]){
if(f==ver[i]) continue;
if(dep[ver[i]]){ext=i;continue;}
b[ver[i]]=val[i];fa[ver[i]]=x;
dfs1(ver[i],x);sz[x]+=sz[ver[i]];
if(sz[son[x]]<sz[ver[i]]) son[x]=ver[i];
}
}int t;
void dfs2(int x,int topf){
idx[x]=++t;tp[x]=topf;a[t]=b[x];
if(!son[x]) return;
dfs2(son[x],topf);
for(int i=head[x];i;i=nxt[i])
if(!idx[ver[i]]&&i!=ext) dfs2(ver[i],ver[i]);
}
#define ls (i<<1)
#define rs (i<<1|1)
#define mid (l+r>>1)
void Push_Up(int i){mn[i]=mn[ls]+mn[rs];}
void Build(int i,int l,int r){
if(l==r){mn[i]=a[l];return;}
Build(ls,l,mid),Build(rs,mid+1,r);
Push_Up(i);
}
void Update(int i,int l,int r,int p,int x){
if(l==r){mn[i]=x;return;}
if(p<=mid) Update(ls,l,mid,p,x);
else Update(rs,mid+1,r,p,x);
Push_Up(i);
}
int Query(int i,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return mn[i];
int ans=0;
if(ql<=mid) ans+=Query(ls,l,mid,ql,qr);
if(qr>mid) ans+=Query(rs,mid+1,r,ql,qr);
return ans;
}
void Change(int x,int z){
int y=bb[x];x=aa[x];
if(x==ver[ext]&&y==frm[ext]||x==ver[ext^1]&&y==frm[ext^1]){val[x]=val[x^1]=z;return;}
if(dep[x]<dep[y]) x=y;
Update(1,1,n,idx[x],z);
}
int Sum(int x,int y){
int sum=0;
while(tp[x]!=tp[y]){
if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
sum+=Query(1,1,n,idx[tp[x]],idx[x]);
x=fa[tp[x]];
}if(dep[x]>dep[y]) swap(x,y);
sum+=Query(1,1,n,idx[x]+1,idx[y]);
return sum;
}
void Q_Min(int x,int y){
int ans=Sum(x,y);
int t1=Sum(x,frm[ext])+Sum(ver[ext],y)+val[ext];
int t2=Sum(x,ver[ext])+Sum(frm[ext],y)+val[ext];
ans=min(t1,ans);
ans=min(t2,ans);
printf("%lld\n",ans);
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++) x=read(),y=read(),z=read(),add(x,y,z),add(y,x,z),aa[i]=x,bb[i]=y;
dfs1(1,0);dfs2(1,1);Build(1,1,n);
while(m--){
opt=read();x=read(),y=read();
if(opt==1) Change(x,y);
else Q_Min(x,y);
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...