线段树合并 85pts 求助 只有一个问题
查看原帖
线段树合并 85pts 求助 只有一个问题
782210
Yu_Chengxuan楼主2024/11/23 14:53

在#10,#15,#19中多次输出不可能的0

照着第一篇题解写的,请不要介意

#include<bits/stdc++.h>
using namespace std;

const int maxn=1e5+10;
int n,m;
struct data{
    int u,cnt;
};
vector <data> vec[maxn];
struct node{
	int l,r;
	data w;
}t[maxn*40];
data datamax(data a,data b){
	if (a.cnt==b.cnt){
		if (a.u<b.u) return a;
		return b;
	}
	if (a.cnt>b.cnt) return a;
	return b;
}
int siz;
inline int lc(int x){
	if (!t[x].l){
		t[x].l=++siz;
	}
	return t[x].l;
}
inline int rc(int x){
	if (!t[x].r){
		t[x].r=++siz;
	}
	return t[x].r;
}
inline void ins(int x,int l,int r,data val){
    if(l==r){
		t[x].w={val.u,val.cnt+t[x].w.cnt};
		return ;
	}
	int mid=l+r>>1;
    if(val.u<=mid){
    	ins(lc(x),l,mid,val);
	}
    else{
    	ins(rc(x),mid+1,r,val);
	}
	t[x].w=datamax(t[lc(x)].w,t[rc(x)].w);
}
inline void merge(int x,int y,int l,int r){
    if(l==r){
		t[x].w={t[x].w.u,t[x].w.cnt+t[y].w.cnt};
		return ;
	}
	int mid=l+r>>1;
    if(t[x].l && t[y].l) merge(lc(x),lc(y),l,mid);
	else if(t[y].l) t[x].l=t[y].l;
    if(t[x].r && t[y].r) merge(rc(x),rc(y),mid+1,r);
	else if(t[y].r) t[x].r=t[y].r;
    t[x].w=datamax(t[lc(x)].w,t[rc(x)].w);
}

vector<int> e[maxn];
int f[maxn][20],dep[maxn];
void dfs1(int u,int fa){
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	for (auto v:e[u]){
		if (v==fa) continue;
		dfs1(v,u);
	}
}
void init(){
	for (int j=1;j<=19;j++){
		for (int i=1;i<=n;i++){
			f[i][j]=f[f[i][j-1]][j-1];
		}
	}
}
int lca(int a,int b){
	if (dep[a]<dep[b]) swap(a,b);
	for (int i=19;i>=0;i--){
		if (dep[f[a][i]]>=dep[b]){
			a=f[a][i];
		}
	}
	if (a==b) return b;
	for (int i=19;i>=0;i--){
		if (f[a][i]!=f[b][i]){
			a=f[a][i];
			b=f[b][i];
		}
	}
	return f[a][0];
}
int ans[maxn];
inline void dfs2(int u){
    for (auto v:e[u]){
		if(v==f[u][0]) continue;
		dfs2(v);
		merge(u,v,0,1e5);
	}
    for(data it : vec[u]){
		ins(u,0,1e5,it);
	}
    ans[u]=t[u].w.u;
}
int main(){
    scanf("%d%d",&n,&m);
    siz=n;
    for(int i=1;i<=n-1;i++){
    	int u,v; 
		scanf("%d%d",&u,&v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs1(1,0);
	init();
    for(int i=1,u,v,col;i<=m;i++){
        scanf("%d%d%d",&u,&v,&col);
		int lc=lca(u,v);
        vec[u].push_back({col,1});
		vec[v].push_back({col,1});
        vec[lc].push_back({col,-1});
		vec[f[lc][0]].push_back({col,-1});
    }
	dfs2(1);
	for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
}
2024/11/23 14:53
加载中...