社区讨论

WA求调教,95分#2

P4556【模板】线段树合并 / [Vani 有约会] 雨天的尾巴参与者 5已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@mjmtbumy
此快照首次捕获于
2025/12/26 19:53
2 个月前
此快照最后确认于
2025/12/28 13:05
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
struct p{
	long long l, r, cnt;
}tree[8000005];
long long n, m, u, v, w, cnt, dep[100005], dp[100005][25], root[100005], ans[100005];
vector<long long> a[100005];
void dfs1(long long x, long long father){
	for(auto i:a[x]){
		if(i==father) continue;
		dep[i]=dep[x]+1;
		dp[i][0]=x;
		for(long long j=1;j<=log2(dep[i]);j++) dp[i][j]=dp[dp[i][j-1]][j-1];
		dfs1(i, x);
	}
}
long long check(long long x, long long k){
	long long now=x;
	for(long long i=floor(log2(k));i>=0;i--){
		if(dep[dp[now][i]]<dep[x]-k) continue;
		now=dp[now][i];
	}
	return now;
}
long long find(long long x, long long y){
	if(dep[x]<dep[y]) swap(x, y);
	x=check(x, dep[x]-dep[y]);
	if(x==y) return x;
	for(long long i=floor(log2(n));i>=0;i--){
		if(dp[x][i]==dp[y][i]) continue;
		x=dp[x][i];
		y=dp[y][i];
	}
	return dp[x][0];
}
void push_up(long long x){
	tree[x].cnt=max(tree[tree[x].l].cnt, tree[tree[x].r].cnt);
}
void build(long long pos, long long k, long long l, long long r, long long &x){
	if(!x) x=++cnt;
	if(l==r){
		tree[x].cnt+=k;
		return ;
	}
	long long mid=(l+r)>>1;
	if(pos<=mid) build(pos, k, l, mid, tree[x].l);
	else build(pos, k, mid+1, r, tree[x].r);
	push_up(x);
}
long long update(long long u, long long v, long long l, long long r){
	if(!u) return v;
	if(!v) return u;
	if(l==r){
		tree[u].cnt+=tree[v].cnt;
		return u;
	}
	long long mid=(l+r)>>1;
	tree[u].l=update(tree[u].l, tree[v].l, l, mid);
	tree[u].r=update(tree[u].r, tree[v].r, mid+1, r);
	push_up(u);
	return u;
}
long long query(long long k, long long l, long long r, long long x){
	if(!x) return 0;
	if(l==r) return l;
	long long mid=(l+r)>>1;
	if(tree[tree[x].l].cnt==k) return query(k, l, mid, tree[x].l);
	else return query(k, mid+1, r, tree[x].r);
}
void dfs(long long x, long long fa){
	for(auto i:a[x]){
		if(i==fa) continue;
		dfs(i, x);
		root[x]=update(root[x], root[i], 1, 100000);
	}
	ans[x]=query(tree[root[x]].cnt, 1, 100000, root[x]);
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(long long i=1;i<n;i++){
		cin>>u>>v;
		a[u].push_back(v);
		a[v].push_back(u);
	}
	dp[1][0]=0;
	dep[1]=1;
	dfs1(1, 0);
	while(m--){
		cin>>u>>v>>w;
		long long LCA=find(u, v);
		build(w, 1, 1, 100000, root[u]);
		build(w, 1, 1, 100000, root[v]);
		build(w, -1, 1, 100000, root[LCA]);
		build(w, -1, 1, 100000, root[dp[LCA][0]]);
	}
	dfs(1, 0);
	for(long long i=1;i<=n;i++) cout<<ans[i]<<'\n';
	return 0;
}

回复

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

正在加载回复...