给定一个有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 }
原文地址:https://www.cnblogs.com/gulangyuzzz/p/12048533.html
时间: 2024-11-05 16:04:47