求序列A中每个数的左边比它小的数的个数(树状数组)
Posted gulangyuzzz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求序列A中每个数的左边比它小的数的个数(树状数组)相关的知识,希望对你有一定的参考价值。
给定一个有N个正整数的序列A(N<=10^5,A[i]<=10^5),对序列中的每一个数,求出序列中它左边比它小的数的个数。
思路:树状数组的经典应用(裸题)
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 5 using namespace std ; 6 7 const int N = 100010 ; 8 9 int c[N] ; 10 11 int lowbit(int x){//取得最右边的一个1 12 return x&(-x) ; 13 } 14 15 int getSum(int x){//区间1~x的和 log(N) 16 int sum = 0 ; 17 for(int i=x;i>0;i-=lowbit(i)){ 18 sum += c[i] ; 19 } 20 return sum ; 21 } 22 23 void update(int x,int v){//单点更新 log(N) 24 for(int i=x;i<=N;i+=lowbit(i)){ 25 c[i] += v ; 26 } 27 } 28 29 30 int main(){ 31 int n, x ; 32 cin >> n ; 33 34 memset(c,0,sizeof c) ; 35 36 for(int i=0;i<n;i++){ 37 cin >> x ; 38 update(x,1) ; 39 cout << getSum(x-1) << endl ; 40 } 41 42 return 0 ; 43 }
以上是关于求序列A中每个数的左边比它小的数的个数(树状数组)的主要内容,如果未能解决你的问题,请参考以下文章