线段树合并求助!
  • 板块学术版
  • 楼主MYiFR
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/1/18 13:32
  • 上次更新2024/1/18 17:32:50
查看原帖
线段树合并求助!
601130
MYiFR楼主2024/1/18 13:32

题目链接

代码:

#include<bits/stdc++.h>
#define ll long long
#define db double
#define ull unsigned ll
#define ldb long db
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pdd pair<db,db>
#define F first
#define S second
#define pb push_back
using namespace std;
const int N=1e5+5;
int n,u,v,c,m,rt[N],siz,lson[N*25],rson[N*25],tr[N*25],ans[N];
vector<int> e[N];
void pushup(int x){
	tr[x]=tr[lson[x]]+tr[rson[x]];
}
void updt(int &x,int l,int r,int p){
	if(!x) x=++siz;
	if(l==r){
		tr[x]=1;
		return;
	}
	int mid=(l+r)>>1;
	if(p<=mid) updt(lson[x],l,mid,p);
	else updt(rson[x],mid+1,r,p);
	pushup(x);
}
int merge(int x,int y,int l,int r){
	if(!x || !y) return x+y;
	if(l==r){
		tr[x]=1;
		return x;
	}
	int mid=(l+r)>>1;
	lson[x]=merge(lson[x],lson[y],l,mid);
	rson[x]=merge(rson[x],rson[y],mid+1,r);
	pushup(x);
	return x;
}
void getans(int cur,int fa){
	for(int to:e[cur]) if(to!=fa){
		getans(to,cur);
		rt[cur]=merge(rt[cur],rt[to],1,N);
	}
	ans[cur]=tr[rt[cur]];
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<n;++i){
		scanf("%d%d",&u,&v);
		e[u].pb(v);
		e[v].pb(u);
	}
	for(int i=1;i<=n;++i){
		scanf("%d",&c);
		updt(rt[i],1,N,c);
	}
	getans(1,0);
	scanf("%d",&m);
	while(m--){
		scanf("%d",&u);
		printf("%d\n",ans[u]);
	}
	return 0;
}

但是这题暴力是能过的……

2024/1/18 13:32
加载中...