求逆序对,数据量大,离散化,当然,这是树状数组的做法。
2299
#define FOPEN freopen("d:\\1.txt","r",stdin)
#define lowbit(x) x & -x
struct sta
{
int va,idx;
int sta;
};
sta s[MAXN];
int n,a;
int num[MAXN];
int cmp(const void *a,const void *b)
{
struct sta *c = (sta *)a;
struct sta *d = (sta *)b;
return d->va - c->va;
}
int cmp1(const void *a,const void *b)
{
struct sta *c = (sta *)a;
struct sta *d = (sta *)b;
return c->sta - d->sta;
}
void add(int x,int va)
{
while(x <= n+1)
{
num[x] += va;
x += lowbit(x);
}
}
int qur(int x)
{
int s=0;
while(x)
{
s += num[x];
x -= lowbit(x);
}
return s;
}
int main()
{
FOPEN;
while(~SCF(n)&&n)
{
SET(num,0);
F(i,n) SCF(s[i].va),s[i].sta = i;
qsort(s,n,sizeof(s[0]),cmp);
F(i,n) s[i].idx = i+1;
qsort(s,n,sizeof(s[0]),cmp1);
long long sum = 0;
F(i,n)
{
sum += qur(s[i].idx);
add(s[i].idx,1);
}
printf("%lld\n",sum);
}
}