树状数组BIT

什么是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));//查询
	}
}
posted @ 2021-09-10 20:25  小帆敲代码  阅读(28)  评论(0编辑  收藏  举报