自学内容网 自学内容网

高级数据结构-树状数组

介绍

树状数组的推导

两个基础操作

模板-acwing795. 前缀和

#include<bits/stdc++.h>
using namespace std;

const int N = 1e6+10;
int c[N]; 

int lowbit(int x){
return x & -x;
}

int query(int x){
int ans = 0;
for(; x; x -= lowbit(x)) ans += c[x];
return ans;
}

void add(int x,int y){
for(; x <= N; x += lowbit(x)) c[x] += y;
}

int main(){
int n,m; scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++){
int num; scanf("%d",&num);
add(i,num);
}
while(m--){
int l,r; scanf("%d%d",&l,&r);
printf("%d\n",query(r)-query(l-1));
}
return 0;
} 

模板-acwing5910. 求逆序对

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N = 1e6+10;
LL c[N],a[N];

int lowbit(int x)  // 返回末尾的1
{
    return x & -x;
}

LL query(int x){
    LL ans = 0;
    for(; x; x -= lowbit(x)) ans += c[x];
    return ans;
}

void add(int x,int y){
    for(; x <= N; x += lowbit(x)) c[x] += y;
}

int main()
{
    LL ans = 0;
    int n; scanf("%d",&n);
    for(int i = 1; i <= n; i++){
        scanf("%d",&a[i]);
    }
    //倒序扫描,找值比当前这个数小但是先进入树状数组的数,即1-(a[i]-1)的和
    for(int i = n; i >= 1; i--){
        ans += query(a[i]-1)-query(0);
        add(a[i],1);
    }
    printf("%lld\n",ans);
    return 0;
}


原文地址:https://blog.csdn.net/m0_69379426/article/details/144358512

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!