赞
踩
给定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:树状数组c[x]覆盖的是x前面lowbit(x)个整数和
2:树状数组是从下标1开始的,所以这个题如果是0->10^5的话,要单独记录0的个数sum0。也就是sum0+getsum(x-1)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。