社区讨论

真·萌新求助...

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 条回复,欢迎继续交流。

正在加载回复...