您的位置:首页 > 产品设计 > UI/UE

poj 2299 Ultra-QuickSort 树状数组求逆序数

2015-04-10 15:07 369 查看
题意:n个数 通过两个相邻的数之间交换,求最小交换次数使n个数非递减(n<=500000,a[i]<=999999999)

a[i]比较大,要用下离散化 ,数据中没有重复的元素提交也对,一定要用long long

#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 500000+10
struct ln
{
int id;
int va;
}in
;
int a
;
int c
;
int n;
int cmp(ln x,ln y)
{
return x.va<y.va;
}
int lowbit(int x)
{
return x&(-x);
}
void updata(int t,int value)
{
for(int i=t;i<=n;i+=lowbit(i))
{
c[i]+=value;
}
}
int getSum(int x)
{
int temp=0;
for(int i=x;i>=1;i-=lowbit(i))
{
temp+=c[i];
}
return temp;
}
int main()
{

while(scanf("%d",&n),n)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&in[i].va);
in[i].id=i;
}
memset(c,0,sizeof(c));
sort(in+1,in+n+1,cmp);
a[in[1].id]=1;
for(int i=2;i<=n;i++)
{
if(in[i].va!=in[i-1].va)
a[in[i].id]=i;
else
a[in[i].id]=a[in[i-1].id];
}
long long sum=0;
for(int i=1;i<=n;i++)
{
updata(a[i],1);
int tmp=i-getSum(a[i]-1);
sum+=tmp-(getSum(a[i])-getSum(a[i]-1));
}
printf("%lld\n",sum);
}
return 0;
}


</pre><pre class="sh_cpp sh_sourceCode" style="font-size:14px; font-family: 'Courier New', Courier, monospace; background-color: white;">
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: