求逆序数
#include <stdio.h>
#include <string.h>
#define N 5050
int a[N],n;
int lowbit(int i)
{
return i&(-i);
}
void add(int i)
{
for(;i<=n; i += lowbit(i))
a[i] ++;
}
int sum(int i)
{
int s = 0;
for(; i > 0; i -= lowbit(i))
s += a[i];
return s;
}
int main()
{
while(scanf("%d",&n)!= EOF)
{
int i,res = 0,b[N];
memset(a,0,sizeof(a));
for(i = 0; i < n; ++i)
{
scanf("%d",&b[i]);
++b[i];
res += sum(n) - sum(b[i]);
add(b[i]);
}
int tmp = res;
///新的逆序数只由移动的最左端的数决定
for(i = 0; i < n; ++i)
{
tmp = tmp + sum(n) - sum(b[
本文主要探讨了HDU 1394题目中涉及的逆序数计算问题,通过分析数组树结构,详细解释了解题思路和算法实现,旨在帮助读者理解逆序对的概念并掌握相关算法技巧。
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



