什么是BIT
- lowbit(x)=x&(-x)其实是取最右边的1和这个1左边的所有0;
- 树形数组的含义是c[x]表示以x结尾,然后向前覆盖lowbit(x)长度的整数之和
- 主要思想其实包含两点 一点是插入的时候更新的是所有与A[i]相关的c[x];二是求和的时候计算的是使用递推公式。
问题描述
- 给定一个含有N个数的序列A,对序列中的每个数 求出序列中它左边比它小的个数
代码
//给定一个含有N个数的序列A,对序列中的每个数 求出序列中它左边比它小的个数
#include<iostream>
#include<algorithm>
using namespace std;
#define lowbit(i) (i&(-i))
//update函数将第x个整数加上v
const int maxn = 100;
int c[maxn];//从i开始覆盖长度为lowbit(i)整数之和
int A[maxn];//表示原始序号i表示数的个数
//update函数将第x个整数加上v
struct node
{
int val;//值
int pos;//原位置
}nodes[maxn];
void update(int v, int x)
{
for (int i = x; i < maxn; i+=lowbit(x))
{
c[i] += v;
}
}
//前x个数之和
int getSum(int x)
{
//
int sum = 0;
for (int i = x; i > 0; i -= lowbit(x))
{
sum += c[i];
}
return sum;
}
bool cmp(node a, node b)
{
return a.val < b.val;
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
int temp;
scanf("%d", &temp);
nodes[i].val = temp;
nodes[i].pos = i;
}
sort(nodes, nodes + n, cmp);
for (int i = 0; i < n; i++)
{
if (i == 0 || nodes[i].val != nodes[i - 1].val)
{
A[nodes[i].pos] = i + 1;//将val表示的很大的数 映射为i+1
}
else {
A[nodes[i].pos] = A[nodes[i-1].pos];
}
}
//进入更新
for (int i = 0; i < n; i++)
{
update(A[i], 1);
printf("%d", getSum(A[i] - 1));//查询
}
}