求助,大佬看看
查看原帖
求助,大佬看看
360279
ytcfghyeee楼主2023/8/26 10:46

有数据吗wa了90’,或者大佬看看,(为什么不提供数据啊,我还以为是分数太低看不了,就交了一次题解,还是看不了数据!呜呜呜)

#include<iostream>
#include<cstdio>
using namespace std;
#define gc getchar
#define mn(a,b) ((a)<(b)?(a):(b))
#define mx(a,b) ((a)>(b)?(a):(b))

//#define int long long
int re(){
	int s=0,a=0;char f=gc();
	while(f<'0'||f>'9'){
		a|=(f=='-');
		f=gc();
	}
	while('0'<=f&&f<='9'){
		s=s*10+f-'0';
		f=gc();
	}return a?-s:s;
}
#define N 210015
int n,m;
int fir[N],tot;
struct xy {
	int v,nt;
}e[N<<1];
void add(int u,int v){
	e[++tot]=(xy){
		v,fir[u]
	};fir[u]=tot;
}
int dfn[N],tl[N],tr[N],pre[N],ct[N],cl[N];
int sn[N],dh[N];
int x1,x2,x3;
bool fl[N];
#define vt e[i].v
#define pf printf
void dfs(int u){
	int i,ax=0;cl[u]=1;
	for(i=fir[u];i;i=e[i].nt)
	if(vt!=pre[u]){
		if(!fl[vt]){
			pre[vt]=u;
			fl[vt]=1;
			dh[vt]=dh[u]+1;
			dfs(vt);
			cl[u]+=cl[vt];
			if(cl[vt]>ax) sn[u]=vt,ax=cl[vt];
		}else{
			x1=u;x2=vt;x3=i>>1;
		}
	}
}
int tim;
int ddg(int u){
	int i;dfn[u]=++tim;tr[u]=u;
	if(u==sn[pre[u]]){
		if(sn[u]){
			tl[sn[u]]=tl[u];
			tr[u]=ddg(sn[u]);
		}
	}else {
		if(sn[u]) tl[sn[u]]=sn[u],ddg(sn[u]);
	}
	i=fir[u];
	while(i>0){	
		if(vt!=pre[u]&&vt!=sn[u]&&
				(!(u==x1&&vt==x2))&&
				(!(u==x2&&vt==x1))	
		  ){
			tl[vt]=vt;
			ddg(vt);
		}
		i=e[i].nt;
	}
	return tr[u];
}
/*
4 5 
1 2 11
1 3 12
2 3 13
1 4 15
2 2 3
1 2 1
2 2 3
2 2 4
2 3 4
*/
int pi[N];
void iol(int u,int x){
	int i=dfn[u],nr=dfn[tr[u]];
	while(i<=nr){
		ct[i]+=x;
		i+=(-i)&i;
	}
}
int sol(int u){
	int i=dfn[u],nl=dfn[tl[u]],s=0;
	while(i>=nl){
		s+=ct[i];
		i-=(-i)&i;
	}return s;
}
int wk(int x,int y){
	int ans=0;
	while(tl[x]!=tl[y]){
		if(dh[x]<dh[y]) swap(x,y);
		ans+=sol(x);
		if(tl[x]!=x) x=tl[x];
		else x=pre[x];
	}if(dh[x]<dh[y]) swap(x,y);
	int n1=sol(x),n2=sol(y);
	ans+=n1-n2;
	return ans;
}
signed main(){
	n=re();
	m=re();
	int i;
	int x,y,z;
	for(i=1;i<=n;++i){
		x=re();
		y=re();
		z=re();
		add(x,n+i);add(n+i,y);
		add(y,n+i);add(n+i,x);
		pi[n+i]=z;
	}
	fl[1]=1;
	dfs(1);
	sn[0]=1;tl[1]=1;
	ddg(1);
	
	for(i=1;i<=n;++i)
	iol(i+n,pi[n+i]);

	int n1=99,n2=99,n3=99;
	for(i=1;i<=m;++i){
		z=re();
		x=re();
		y=re();
		if(z==1){
			if(x!=x3){
				iol(n+x,-pi[n+x]);
				iol(n+x,y);
			}
			pi[n+x]=y;
		}
		else{
			n1=wk(x,y);
			n2=wk(x,x1)+wk(y,x2)+pi[n+x3];
			n3=wk(x,x2)+wk(y,x1)+pi[n+x3];
			pf("%d\n",mn(n1,mn(n2,n3)));
		}
	}
	return 0;
}
2023/8/26 10:46
加载中...