P3605 [USACO17JAN]Promotion Counting P (dsu+线段树)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3605 [USACO17JAN]Promotion Counting P (dsu+线段树)相关的知识,希望对你有一定的参考价值。
太久没写题了,写道板子题愉悦一下身心~
没什么要说的,就 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(树状数组)