P3605 [USACO17JAN]Promotion Counting P (dsu+线段树)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3605 [USACO17JAN]Promotion Counting P (dsu+线段树)相关的知识,希望对你有一定的参考价值。

LINK

太久没写题了,写道板子题愉悦一下身心~

没什么要说的,就 d s u dsu dsu,动态开点权值线段树记录一下每个权值有几个

#include <bits/stdc++.h>
using namespace std;
#define mid (l+r>>1)
const int maxn = 4e5+10;
const int inf = 2e9;
int n,a[maxn],ans[maxn];
vector<int>vec[maxn];
int ls[maxn<<4],rs[maxn<<4],sum[maxn<<4],id,root;
void insert(int &rt,int l,int r,int val,int zhi)
{
	if( !rt )	rt = ++id;
	if( l==r && l==val ){ sum[rt] += zhi; return; }
	if( val<=mid )	insert(ls[rt],l,mid,val,zhi );
	else	insert( rs[rt],mid+1,r,val,zhi );
	sum[rt] = sum[ls[rt]]+sum[rs[rt]];
}
int ask(int rt,int l,int r,int L,int R)
{
	if( !rt )	return 0;
	if( l>=L && r<=R )	return sum[rt];
	if( l>R || r<L )	return 0;
	return ask( ls[rt],l,mid,L,R )+ask( rs[rt],mid+1,r,L,R );
}
int siz[maxn],son[maxn],dfn[maxn],low[maxn],topf[maxn],dfsid;
void predfs(int u)
{
	siz[u] = 1; dfn[u] = ++dfsid; topf[dfsid] = u;
	for(auto v:vec[u] )
	{
		predfs( v );
		siz[u] += siz[v];
		if( siz[v]>siz[son[u]] )	son[u] = v;
	}
	low[u] = dfsid;
}
void calc(int u)
{
	insert( root,1,inf,a[u],1 );
	for(auto v:vec[u] )
	{
		if( v==son[u] )	continue;
		for(int j=dfn[v];j<=low[v];j++)
			insert(root,1,inf,a[topf[j]],1 );
	}
	ans[u] = ask(root,1,inf,a[u]+1,inf);
}
void clear(int u)
{
	insert( root,1,inf,a[u],-1 );
	for(auto v:vec[u] )
	for(int j=dfn[v];j<=low[v];j++)
		insert(root,1,inf,a[topf[j]],-1 );
}
void dsu(int u,int keep)
{
	for(auto v:vec[u] )
	{
		if( v==son[u] )	continue;
		dsu( v,0 );
	}
	if( son[u] )	dsu( son[u],1 );//保留
	calc( u );//计算u的所有贡献 
	if( !keep )	clear( u );
}
int main()
{
	cin >> n;
	for(int i=1;i<=n;i++)	scanf("%d",&a[i] );
	for(int i=2;i<=n;i++)
	{
		int x; scanf("%d",&x );
		vec[x].push_back( i );
	}
	predfs( 1 ); dsu( 1,1 );
	for(int i=1;i<=n;i++)	printf("%d\\n",ans[i] );
	return 0;
} 

以上是关于P3605 [USACO17JAN]Promotion Counting P (dsu+线段树)的主要内容,如果未能解决你的问题,请参考以下文章

P3605 [USACO17JAN]Promotion Counting P (dsu+线段树)

P3605 [USACO17JAN]Promotion Counting P (线段树合并)

P3605 [USACO17JAN]Promotion Counting P (线段树合并)

P3605 [USACO17JAN]Promotion Counting P(树状数组)

P3605 [USACO17JAN]Promotion Counting P(树状数组)

题解 P3605 [USACO17JAN]Promotion Counting晋升者计数