萌新刚学OI零点五毫秒,简单题玄关求条
查看原帖
萌新刚学OI零点五毫秒,简单题玄关求条
1178961
wangjunyee楼主2025/8/5 14:19

WA 15pts,AC on #1 #2 #4

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10; 

int read()
{
	int s=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		s=s*10+c-'0';
		c=getchar();
	}
	return s*f;
}

struct tree_node{
	int u,cnt;
	friend bool operator<(tree_node a,tree_node b){return (a.cnt==b.cnt)?a.u>b.u:a.cnt<b.cnt;}
	friend tree_node operator+(tree_node a,tree_node b){return (tree_node){a.u,a.cnt+b.cnt};}
};

int n,m;

struct linetree{
	int s[N<<6][2];
	tree_node v[N<<6];
	int ct;
	void insert(int p,int l,int r,tree_node ve)
	{
		if(r-l==1){
			v[p]=ve+v[p];
			return;			
		}
		int mid=(l+r)/2;
		if(ve.u<=mid) 
			insert(s[p][0]=s[p][0]?s[p][0]:++ct,l,mid,ve);
		else insert(s[p][1]=s[p][1]?s[p][1]:++ct,mid,r,ve);
		v[p]=max(v[s[p][0]],v[s[p][1]]);
	}
	void merge(int p1,int p2,int l,int r)
	{
		if(r-l==1){
			v[p1]=v[p1]+v[p2];
			return;
		}
		int mid=(l+r)/2;
		if(s[p1][0]&&s[p2][0])
			merge(s[p1][0],s[p2][0],l,mid);
		else if(s[p2][0])s[p1][0]=s[p2][0];
		if(s[p1][1]&&s[p2][1])
			merge(s[p1][1],s[p2][1],mid,r);
		else if(s[p2][1])s[p1][1]=s[p2][1];
		v[p1]=max(v[s[p1][0]],v[s[p1][1]]);
	}    
}tr;

vector<tree_node> ve[N];

struct edge{
	int v,next;
}e[N<<1];
int head[N],cnt;

void add(int u,int v)
{
	e[++cnt].v=v;
	e[cnt].next=head[u];
	head[u]=cnt;
}

int fa[N][22],dep[N];

void dfs1(int u,int lastu)
{
	fa[u][0]=lastu;
	dep[u]=dep[lastu]+1;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].v;
		if(v==lastu)continue;
		dfs1(v,u);
	}
}

void init()
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=20;j++)
			fa[i][j]=fa[fa[i][j-1]][j-1];
}

int lca(int x,int y)
{
	if(dep[x]<dep[y])swap(x,y);
	for(int i=0,d=dep[x]-dep[y];d;i++,d>>=1)
		if(d&1)x=fa[x][i];
	if(x==y)return x;
	for(int i=20;i>=0;i--)
		if(fa[x][i]!=fa[y][i])
			x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}

int ans[N];

void dfs2(int u,int father)
{
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].v;
		if(v==father)continue;
		dfs2(v,u);
		tr.merge(u,v,0,1e5+5);
	}
	for(int i=0;i<ve[u].size();i++){
		tree_node v=ve[u][i];
		tr.insert(u,0,1e5+5,v);
	}
	ans[u]=tr.v[u].u;
}

signed main()
{
	n=read(),m=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		add(u,v);
		add(v,u);
	}
	

	
	dfs1(1,0);
	init();
	for(int i=1;i<=m;i++){
		int x=read(),y=read(),z=read();
		int lc=lca(x,y);
		ve[x].push_back((tree_node){z,1});
		ve[y].push_back((tree_node){z,1});
		ve[lc].push_back((tree_node){z,-1});
		ve[fa[lc][0]].push_back((tree_node){z,-1});
	}
	tr.ct=n;
	dfs2(1,0);
	for(int i=1;i<=n;i++)
		cout<<ans[i]<<"\n";
	
	return 0;
}

2025/8/5 14:19
加载中...