当前位置:   article > 正文

算法笔记.序列左边比它小的元素个数(树状数组)_c语言输出每一位元素左边不超过其大小的元素个数

c语言输出每一位元素左边不超过其大小的元素个数

给定N个正整数 (N<10^5 每个元素< 10^5,对序列中的每个元素,求出左边比它小的元素个数。

分析: 求比它小的元素个数 ->区间和;数组大小开到10^5不会爆,所以不用离散化。
具体做法: 每输入一个元素,update(x, 1);左边比他小的:getsum(x-1);

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) (x & (-x)) //能整除x的最大2次幂,比如01101010得到的是00000010

const int N = 100000;
int c[N];

void update(int x, int v){
	for (int i = x; i <= N; i += lowbit(i)){
		c[i] += v;
	}
}
int getsum(int x){
	int sum = 0;
	for (int i = x; i > 0; i -= lowbit(i)){
		sum += c[i];
	}	
	return sum;
}
int main(){
	int n;
	cin >> n;
	int x;
	while (n--) {
		cin >> x;
		update(x, 1); //单点更新 
		cout << getsum(x - 1) << endl; //区间查询 
	} 
    return 0;
} 
输入:
5
2 5 1 3 4
输出:
0 1 0 2 3
  • 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

注意:
1:树状数组c[x]覆盖的是x前面lowbit(x)个整数和
2:树状数组是从下标1开始的,所以这个题如果是0->10^5的话,要单独记录0的个数sum0。也就是sum0+getsum(x-1)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/227676
推荐阅读
相关标签
  

闽ICP备14008679号