求助卡常,T死在了#131
  • 板块学术版
  • 楼主syzf2222
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/7/8 23:09
  • 上次更新2023/11/6 23:26:00
查看原帖
求助卡常,T死在了#131
140876
syzf2222楼主2020/7/8 23:09

有没有可能是复杂度问题?

卡的我怀疑人生……

还请各位大佬看一下。

(还有吐槽一下CF一个题怎么设这么多点)

#include<bits/stdc++.h>
const int maxn=1e6+10;
int n,ans[maxn],tot,rt[maxn],Max;
int beg[maxn],nex[maxn<<1],to[maxn<<1],e;
inline void add(int x,int y){
	e++;nex[e]=beg[x];beg[x]=e;to[e]=y;
}
int dep[maxn];
struct node{
	int val,l,r;
}tr[maxn*20];
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
	return x*f;
}
inline int update(int h,int l,int r,int x){
	if(!h)h=++tot;
	if(l==r){tr[h].val++;return h;}
	int mid=(l+r)>>1;
	if(mid>=x)tr[h].l=update(tr[h].l,l,mid,x);
	else tr[h].r=update(tr[h].r,mid+1,r,x);
	tr[h].val=std::max(tr[tr[h].l].val,tr[tr[h].r].val);
	return h;
}
inline int merge(int a,int b,int l,int r){
	if(!a)return b;
	if(!b)return a;
	if(l==r){
		tr[a].val+=tr[b].val;
		return a;
	}
	int mid=(l+r)>>1;
	tr[a].l=merge(tr[a].l,tr[b].l,l,mid);
	tr[a].r=merge(tr[a].r,tr[b].r,mid+1,r);
	tr[a].val=std::max(tr[tr[a].l].val,tr[tr[a].r].val);
	return a;
}
inline int query(int h,int l,int r){
	if(l==r)return l;
	int mid=(l+r)>>1;
	if(tr[tr[h].l].val>=tr[tr[h].r].val)
		return query(tr[h].l,l,mid);
	else return query(tr[h].r,mid+1,r);
}
inline void trydeep(int x,int fa){
	dep[x]=dep[fa]+1;
	for(register int i=beg[x];i;i=nex[i])
		if(to[i]!=fa)trydeep(to[i],x);
	Max=Max<dep[x]?dep[x]:Max;
}
inline void dfs(int x,int fa){
	rt[x]=update(rt[x],1,Max,dep[x]);
	for(register int i=beg[x];i;i=nex[i]){
		int t=to[i];
		if(t==fa)continue;
		dfs(t,x);
		rt[x]=merge(rt[x],rt[t],1,Max);
	}
	ans[x]=query(rt[x],1,Max);
}
int main(){
	n=read();
	int x,y;
	for(register int i=1;i<n;i++){
		x=read(),y=read();
		add(x,y),add(y,x);
	}
	trydeep(1,0);
	dfs(1,0);
	for(register int i=1;i<=n;i++)
		printf("%d\n",ans[i]-dep[i]);
	return 0;
}
2020/7/8 23:09
加载中...