为什么90分
查看原帖
为什么90分
1181989
quanguanyu楼主2024/11/30 18:49

首先声明:本人蒟蒻,马蜂抽象

WA #2 90分

#include <iostream>
#include <cstring>
using namespace std;
const int N=100010;
long long lazy[N*4],m,rk[N],nnn[N],SBmin[4*N],n,ti,fir[N],nex[N*2],to[N*2],cnt,siz[N],dad[N],dep[N],heavy[N],top[N],dfn[N],root;
void add(long long u,long long v){
	cnt++;
	nex[cnt]=fir[u];
	fir[u]=cnt;
	to[cnt]=v;
}
void dfs1(long long u,long long baba){
	siz[u]=1;
	dad[u]=baba;
	dep[u]=dep[baba]+1;
	heavy[u]=-1;
	long long ma=0;
	for(long long i=fir[u];i;i=nex[i]){
		long long v=to[i];
		if(v==baba)continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>ma){
			ma=siz[v];
			heavy[u]=v;
		}
	}
}
void dfs2(long long u,long long xh){
	top[u]=xh;
	dfn[u]=++ti;
	rk[ti]=u;
	if(heavy[u]!=-1){
		dfs2(heavy[u],xh);
	}
	for(long long i=fir[u];i;i=nex[i]){
		long long v=to[i];
		if(v!=dad[u]&&v!=heavy[u]){
			dfs2(v,v);
		}
	}
}
void build(long long k,long long l,long long r){
	if(l>r)return;
	if(l==r){
		SBmin[k]=nnn[rk[l]]; 
		return;
	}
	build(k*2,l,(l+r)/2);
	build(k*2+1,(l+r)/2+1,r);
	SBmin[k]=min(SBmin[k*2],SBmin[k*2+1]);
}
void pushdown(long long k){
	if(!lazy[k]){
		return;
	}
	SBmin[2*k]=lazy[k];
	lazy[2*k]=lazy[k];
	SBmin[2*k+1]=lazy[k];
	lazy[2*k+1]=lazy[k];
	lazy[k]=0;
}
void change(long long k,long long l,long long r,long long x,long long y,long long d) {
    if(r<x||l>y) return ;
    if(x<=l&&r<=y){
		lazy[k]=d;
    	SBmin[k]=d;
        return;
    }
    long long mid=(l+r)/2;
    pushdown(k);
	if(mid>=x)change(k*2,l,mid,x,y,d);
    if(mid<y)change(k*2+1,mid+1,r,x,y,d);
	SBmin[k]=min(SBmin[k*2],SBmin[k*2+1]);
}
long long ans_min(long long ql,long long qr,long long l,long long r,long long k){
    if(r<ql||l>qr) return 9223372036854775807;
	if(ql<=l&&r<=qr)return SBmin[k];
	pushdown(k);
	long long mid=(l+r)>>1,res=9223372036854775807;
	if(ql<=mid)res=min(res,ans_min(ql,qr,l,mid,k*2));
	if(qr>mid)res=min(res,ans_min(ql,qr,mid+1,r,k*2+1));
	return res;
}
void modify(long long x,long long y,long long num){
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]])swap(x,y);
        change(1,1,n,dfn[top[x]],dfn[x],num);
        x=dad[top[y]];
    }
    if(dep[x]>dep[y])swap(x,y);
    change(1,1,n,dfn[x],dfn[y],num);
}
main() {
	cin>>n>>m;
	for(long long i=1;i<n;i++){
		long long a,b;
		cin>>a>>b;
		add(a,b);
		add(b,a);
	}
	for(long long i=1;i<=n;i++){
		cin>>nnn[i];
	}
	memset(SBmin,127,sizeof SBmin);
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	cin>>root;
	while(m--){
		long long a,b,c;
		cin>>a;
		if(a==1){
			cin>>root;
		}
		else if(a==2){
			cin>>b>>c>>a;
			if(b>c)swap(b,c);
			modify(b,c,a);
		}
		else if(a==3){
			cin>>b;
			if(b==root){
				cout<<SBmin[1];
			}
			else if(dfn[b]>dfn[root]||dfn[b]+siz[b]<=dfn[root]){
				cout<<ans_min(dfn[b],dfn[b]+siz[b]-1,1,ti,1);
			}
			else{
				long long v=root,o;
			    while(top[b]!=top[v]){
			        if(dad[top[v]]==b){
			        	o=top[v];
			        	goto sb;
			        }
			        v=dad[top[v]];
			    } 
			    o=heavy[b];
			    sb:;
				long long ans=9223372036854775807;
				ans=min(ans_min(dfn[1],dfn[o]-1,1,ti,1),ans_min(dfn[o]+siz[o],ti,1,ti,1));
				cout<<ans;
			}
			cout<<endl;
		}
	}
	return 0;
}

求调!

不要注意变量名

2024/11/30 18:49
加载中...