基本概念
编辑int lowbit(int x)
{
return x&-x;
}
树状数组的经典操作
void add(int k,int num)
{
while(k<=n)
{
tree[k]+=num;
k+=k&-k;
}
}
int read(int k)//1~k的区间和
{
int sum=0;
while(k)
{
sum+=tree[k];
k-=k&-k;
}
return sum;
}
例题如下:
第1行:N,N为序列的长度(n <= 50000) 第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9)
输出逆序数
4 2 4 3 1
4
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<limits.h>
#include<queue>
#include<stack>
#include<vector>
#include<math.h>
#include<map>
using namespace std;
#define maxn 50005
int n;
struct node
{
int x,order;
}a[maxn];
int b[maxn],tree[maxn]={0};
long long ans=0;
bool comp(node p,node q)
{
if(p.x<q.x || p.x==q.x && p.order<q.order)
return 1;
return 0;
}
void update(int k)
{
while(k<=n)
{
tree[k]++;
k+=k&-k;
}
}
int query(int k)
{
int sum=0;
while(k>0)
{
sum+=tree[k];
k-=k&-k;
}
return sum;
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i].x);
a[i].order=i;
}
sort(a+1,a+n+1,comp);
for(i=1;i<=n;i++)
{
update(a[i].order);
ans+=query(a[i].order-1);
}
printf("%lld\n",(long long)n*(n-1)/2-ans);
}