第一个数据始终输出3!
查看原帖
第一个数据始终输出3!
754310
Pepsee楼主2023/11/16 15:31

我看了讨论区以为是pushup的问题,但是我改了之后一样的输出的3,实在不理解

#include <bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}
int n,m,cnt = 0,rot = 0;
int head[114514],tot,root[114514];
int ans[114514];
struct nd{
	int nex,to;
}edge[114514<<1];
struct nn{
	int lson,rson,val,mx;
}tr[114514<<6];
int top[114514],siz[114514],son[114514],dep[114514],f[114514];
void add(int x,int y)
{
	edge[++tot].nex = head[x];
	edge[tot].to = y;
	head[x] = tot;
}
//--------以下为树剖-----------
void dfs1(int x,int fa)
{
	f[x] = fa; dep[x] = dep[fa]+1;
	siz[x] = 1;
	for (int i = head[x]; i; i = edge[i].nex)
	{
		int v = edge[i].to;
		if (v == fa) continue;
		dfs1(v,x);
		siz[x] += siz[v];
		if (siz[v] > siz[son[x]])
			son[x] = v;
	}
}
void dfs2(int x,int tp)
{
	top[x] = tp;
	if (son[x]) dfs2(son[x],tp);
	for (int i = head[x]; i; i = edge[i].nex)
	{
		int v = edge[i].to;
		if (v==f[x] || v==son[x])
			continue;
		dfs2(v,v);
	}
}
int LCA(int x,int y)
{
	while (top[x] != top[y]){
		if (dep[top[x]] < dep[top[y]])
			swap(x,y);
		x = f[top[x]];
	}
	return dep[x]<dep[y]?x:y;
}
//--------以上为树剖------------
//--------以下为线段树 ----------
void pushup(int rt){
	if (tr[tr[rt].lson].val >= tr[tr[rt].rson].val){
		tr[rt].val = tr[tr[rt].lson].val;
		tr[rt].mx = tr[tr[rt].lson].mx;
	}else{
		tr[rt].val = tr[tr[rt].rson].val;
		tr[rt].mx = tr[tr[rt].rson].mx;
	}
}
int merge(int x,int y,int l,int r)
{
	if (!x) return y;
	if (!y) return x;
	if (l == r){
		tr[x].val += tr[y].val;
		return x;
	}
	int mid = (l+r) >> 1;
	tr[x].lson = merge(tr[x].lson,tr[y].lson,l,mid);
	tr[x].rson = merge(tr[x].rson,tr[y].rson,mid+1,r);
	pushup(x);
	return x;
}
int add(int rt,int l,int r,int x,int a)
{
	if (!tr[rt].val) rt = ++cnt;
	if (l == r)
	{
		tr[rt].val += a;
		tr[rt].mx = x;
		return rt;
	}
	int mid = (l+r) >> 1;
	if (x <= mid)
		tr[rt].lson = add(tr[rt].lson,l,mid,x,a);
	else
		tr[rt].rson = add(tr[rt].rson,mid+1,r,x,a);
	pushup(rt);
	return rt;
}
//--------以上为线段树 ----------
void dfs(int x)
{
	for (int i = head[x]; i; i = edge[i].nex)
	{
		int v = edge[i].to;
		if (v == f[x]) continue;
		dfs(v);
		root[x] = merge(root[x],root[v],1,1e5);
	}
	if (tr[root[x]].val) ans[x] = tr[root[x]].mx;
}
int main()
{
	n = read(); m = read();
	for (int i = 1,u,v; i < n; i++)
		u = read(),v = read(),add(u,v),add(v,u);
	dfs1(1,0); dfs2(1,1);
	int x,y,col;
	while (m--)
	{
		x = read(); y = read();
		col = read();
		int lca = LCA(x,y);
		root[x] = add(root[x],1,1e5,col,1);
		root[y] = add(root[y],1,1e5,col,1);
		root[lca] = add(root[lca],1,1e5,col,-1);
		if (f[lca]) root[f[lca]] = add(root[f[lca]],1,1e5,col,-1);
	}
	dfs(1);
	for (int i = 1; i <= n; i++)
		printf("%d\n",ans[i]);
	return 0;
}
2023/11/16 15:31
加载中...