QwQ 哪里写炸了
查看原帖
QwQ 哪里写炸了
542905
WannaYellow楼主2022/7/16 18:20
#include<iostream>
using namespace std;
int n,path[300005];
//---------BUILD GRAPH-------------
struct Edge{
	int to,next;
}e[300005<<1];
int head[300005],cntedge;
void addedge(int u,int v){
	e[++cntedge].to=v;
	e[cntedge].next=head[u];
	head[u]=cntedge;
}
void daddedge(int u,int v){
	addedge(u,v);
	addedge(v,u);
}
//-------------END----------------
//----------树链剖分--------------
struct Node{
	int fa,dep,id,top,size,h_son;
}nod[300004];
int cntid;
void dfs1(int f,int x){
	nod[x].fa=f;
	nod[x].dep=nod[f].dep+1;
	nod[x].size=1;
	for(int i=head[x];i;i=e[i].next){
		if(e[i].to==f)continue;
		dfs1(x,e[i].to);
		if(nod[e[i].to].size>nod[nod[x].h_son].size)nod[x].h_son=e[i].to;
		nod[x].size+=nod[e[i].to].size;
	}
} 
void dfs2(int top,int x){
	nod[x].top=top;
	nod[x].id=++cntid;
	if(nod[x].size==1)return;
	dfs2(top,nod[x].h_son);
	for(int i=head[x];i;i=e[i].next){
		if(e[i].to==nod[x].fa||e[i].to==nod[x].h_son)continue;
		dfs2(e[i].to,e[i].to);
	}
}
//-----------END---------------------
//-----------SegmentTree-------------
struct SegTree{
	#define mid ((l+r)>>1)
	int a[300005<<2],t[300005<<2];
	int ls(int x){return x<<1;}
	int rs(int x){return x<<1|1;}
	void add(int x,int l,int r,int k=1){
		a[x]+=(r-l+1)*k;
		t[x]+=k;
	}
	void push_down(int x,int l,int r){
		if(t[x]){
			t[x]=0;
			add(ls(x),l,mid,t[x]);
			add(rs(x),mid+1,r,t[x]);
		}
	}
	void update(int x){a[x]=a[ls(x)]+a[rs(x)];}
	void modify(int x,int l,int r,int ml,int mr,int k=1){
		if(ml<=l&&r<=mr){
			add(x,l,r,k);
			return;
		}
		push_down(x,l,r);
		if(ml<=mid)modify(ls(x),l,mid,ml,mr,k);
		if(mr>mid)modify(rs(x),mid+1,r,ml,mr,k);
		update(x);
	}
	int query(int x,int l,int r,int pos){
		if(l==r)return a[x];
		push_down(x,l,r);
		if(pos<=mid)return query(ls(x),l,mid,pos);
		else if(pos>mid)return query(rs(x),mid+1,r,pos);
	}
	#undef mid
}T;
//--------------操作------------
void lca(int s,int t){
	while(nod[s].top!=nod[t].top){
		if(nod[nod[s].top].dep<nod[nod[t].top].dep)swap(s,t);
		T.modify(1,1,n,nod[nod[s].top].id,nod[s].id);
		s=nod[nod[s].top].fa;
	}
	if(nod[s].dep>nod[t].dep)swap(s,t);
	T.modify(1,1,n,nod[s].id,nod[t].id);
}
int query(int x){
	return T.query(1,1,n,nod[x].id);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>path[i];
	}
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		daddedge(u,v);
	}
	dfs1(0,1);
	dfs2(1,1);
	for(int i=1;i<n;i++){
		lca(path[i],path[i+1]);
		T.modify(1,1,n,nod[path[i+1]].id,nod[path[i+1]].id,-1);
	}
	for(int i=1;i<=n;i++){
		cout<<query(i)<<"\n";
	}
	return 0;
}
2022/7/16 18:20
加载中...