萌新求助线段树合并
查看原帖
萌新求助线段树合并
253738
听取MLE声一片楼主2021/8/18 23:17

在第67个点T了,求调

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<complex>
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
void write(int x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10|'0');
}
const int N=2e6+10;
const int M=2e7+10;
int n,head[N],nex[N<<1],to[N<<1],dep[N],cnt,tot;
int a[M],id[M],root[N],lc[M],rc[M],ans[N];
inline void add(int u,int v){
	nex[++cnt]=head[u];
	head[u]=cnt;
	to[cnt]=v;
}
void dfs1(int u,int fa){
	dep[u]=dep[fa]+1;
	for(int e=head[u];e;e=nex[e]){
		int v=to[e];
		if(v==fa)
			continue;	
		dfs1(v,u);
	}
}
void query(int &p,int l,int r,int x,int val){
	if(!p)
		p=++tot;
	if(l==r){
		a[p]+=val;
		id[p]=x;
		return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid)
		query(lc[p],l,mid,x,val);
	else query(rc[p],mid+1,r,x,val);
	if(a[lc[p]]>=a[rc[p]]){
		a[p]=a[lc[p]];	
		id[p]=id[lc[p]];
	}
	else{
		a[p]=a[rc[p]];
		id[p]=id[rc[p]];
	}
}
int merge(int x,int y,int l,int r){
	if(!x)
		return y;
	if(!y)
		return x;
	if(l==r){
		a[x]+=a[y];
		id[x]=l;
		return x;
	}
	int mid=(l+r)>>1;
	lc[x]=merge(lc[x],lc[y],l,mid);
	rc[x]=merge(rc[x],rc[y],mid+1,r);
	if(a[lc[x]]>=a[rc[x]]){
		a[x]=a[lc[x]];
		id[x]=id[lc[x]];
	}
	else{
		a[x]=a[rc[x]];
		id[x]=id[rc[x]];	
	}	
	return x;
}
void dfs2(int u,int fa){
	query(root[u],1,n,dep[u],1);
	for(int e=head[u];e;e=nex[e]){
		int v=to[e];
		if(v==fa)
			continue;
		dfs2(v,u);	
		root[u]=merge(root[u],root[v],1,n);
	}
	ans[u]=id[root[u]]-dep[u];
}
int main()
{
	n=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		add(u,v);
		add(v,u);
	}
	dfs1(1,0);
	dfs2(1,0);
	for(int i=1;i<=n;i++){
		write(ans[i]);putchar('\n');
	}
	return 0;
}

2021/8/18 23:17
加载中...