社区讨论

mx求调树剖80pts,WAon7&10

P3979遥远的国度参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m1ukrhdi
此快照首次捕获于
2024/10/04 18:20
去年
此快照最后确认于
2025/11/04 18:05
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>

using namespace std;
#define N 100100
#define ls (p<<1)
#define rs (p<<1|1)

const int inf = 2e9;
int n,m,rt,v[N];
int dep[N],f[N],s[N],siz[N],son[N],cnt,a[N],tp[N],id[N];
vector<int> e[N];
struct Segtree{
	int l,r,Min,tag;
}t[N<<2];

void dfs(int x,int fa){
	f[x]=fa,s[fa]=x,siz[x]=1;
	dep[x]=dep[fa]+1;
	for(int i=0;i<e[x].size();i++){
		int y=e[x][i];
		if(y== fa) continue;
		dfs(y,x);
		siz[x]+=siz[y];
		if(siz[y]>siz[son[x]])
			son[x]=y;
	}
}

void dfs2(int x,int top){
	tp[x]=top;
	id[x]=++cnt;
	a[id[x]]=x;
	if(son[x]) dfs2(son[x],top);
	for(int i=0;i<e[x].size();i++)
		if(e[x][i]!=f[x] && e[x][i]!=son[x])
			dfs2(e[x][i],e[x][i]);
}

void pushup(int p){
	t[p].Min=min(t[ls].Min,t[rs].Min);
}
void pushdown(int p){
	if(!t[p].tag) return ;
	t[ls].Min=t[p].tag;
	t[rs].Min=t[p].tag;
	t[ls].tag=t[p].tag;
	t[rs].tag=t[p].tag;
	t[p].tag=0;
}
void build(int p,int l,int r){
	t[p].l=l,t[p].r=r,t[p].Min=inf;
	if(l==r){
		t[p].Min=v[a[l]],t[p].tag=0;
		return;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(p);
}

void update(int p,int l,int r,int v){
	if(l<=t[p].l && r>=t[p].r){
		t[p].tag=t[p].Min=v;
		return;
	}
	pushdown(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid) update(ls,l,r,v);
	if(r>mid) update(rs,l,r,v);
	pushup(p);
}

int query(int p,int l,int r){
	if(l<=t[p].l && r>=t[p].r) return t[p].Min;
	pushdown(p);
	int mid=(t[p].l+t[p].r)>>1;
	int ans=inf;
	if(l<=mid) ans=min(ans,query(ls,l,r));
	if(r>mid) ans=min(ans,query(rs,l,r));
	pushup(p);
	return ans;
}

void updatelink(int x,int y,int v){
	while(tp[x]!=tp[y]){
		if(dep[tp[x]]>dep[tp[y]]){
			update(1,id[tp[x]],id[x],v);
			x=f[tp[x]];
		}else{
			update(1,id[tp[y]],id[y],v);
			y=f[tp[y]];
		}
	}
	if(dep[x]>dep[y]) swap(x,y);
	update(1,id[x],id[y],v);
}

int glca(int x,int y){
	while(tp[x]!=tp[y]){
		if(dep[tp[x]]>dep[tp[y]]) x=f[tp[x]];
		else y=f[tp[y]];
	}
	if(dep[x]<dep[y]) return x;
	else return y;
}

void que(int x){
	int lca=glca(x,rt);
	if(lca==rt) cout<<query(1,id[x],id[x]+siz[x]-1)<<endl;
	else if(lca==x){
		int l=id[s[x]],r=id[s[x]]+siz[s[x]]-1;
		if(l>r) return;
		if(l>1 && r<n) cout<<min(query(1,1,l-1),query(1,r+1,n))<<endl;
		else if(l==1 && r<n) cout<<query(1,r+1,n)<<endl;
		else if(l>1 && r<=n) cout<<query(1,1,l-1)<<endl;
	}else cout<<query(1,id[x],id[x]+siz[x]-1)<<endl;
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<n;i++){
		int u,v; cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	for(int i=1;i<=n;i++) cin>>v[i];
	dfs(1,1);
	dfs2(1,1);
	build(1,1,n);
	int id; cin>>id; rt=id;
	while(m--){
		int opt,id,x,y,v; cin>>opt;
		if(opt==1) {
			cin>>id;
			rt=id;
		}else if(opt==2){
			cin>>x>>y>>v;
			updatelink(x,y,v);
		}else{
			cin>>id;
			que(id);
		}
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...