随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

求  某节点子树内比该节点的点权大的点的个数

 

值域上维护树状数组,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <bits/stdc++.h>
using namespace std ;
 const int N=1e5+2,M=N*2;
 int bin[N],len;
 int sum[N] ,n,ans[N],a[N];
  
 int nxt[M],go[M],hd[N],all;
  
 void add_(int x,int y){
    go[++all]=y,nxt[all]=hd[x];
    hd[x]=all;
 }
 int lowbit(int x){
    return x&-x;
 }
 int qq(int x){
    int res= 0;
    for(;x;x-=lowbit(x)) res+=sum[x];
    return res;
 }
 void add(int x,int v){
    for(;x<=n;x+=lowbit(x)) sum[x]+=v ;
 }
 void dfs(int x){
    ans[x]-= qq(n)-qq(a[x]);
     
    for(int i=hd[x];i;i=nxt[i]){
        int y=go[i];
        dfs(y);
    }
     
    ans[x]+= qq(n)-qq(a[x]);
    add(a[x],1);
 }
 signed main(){
    int i,x;
    cin>>n;
    for(i=1;i<=n;i++) cin>>a[i],bin[++len]=a[i];
    sort(bin+1,bin+1+len);
    len=unique(bin+1,bin+1+len)-bin-1;
    for(i=1;i<=n;i++)
        a[i]=lower_bound(bin+1,bin+1+len,a[i])-bin;
     
    for(i=2;i<=n;i++) cin>>x,add_(x,i);
    dfs(1);
    for(i=1;i<=n;i++) cout<<ans[i]<<endl;
 }

 

posted on   towboat  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示