MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

POJ 2299

Posted on 2011-07-21 16:46  MDeath-Kid  阅读(252)  评论(0编辑  收藏  举报

求逆序对,数据量大,离散化,当然,这是树状数组的做法。

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);
}
}