POJ 2299 离散化+树状数组求逆序数

貌似用的stable_sort是多余的


#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;


#define typev int // type of res 
typev ar[500005]; // index: 1 ~ N 
int lowb(int t) { return t & (-t) ; } 
void add(int i, typev v) { 
	for ( ; i < 500005; ar[i] += v, i += lowb(i)); 
} 
typev sum(int i) { 
	typev s = 0; 
	for ( ; i > 0; s += ar[i], i -= lowb(i)); 
	return s; 
} 



pair<int,int> A[500005];
int B[500005];

bool cmp(const pair<int,int>& a,const pair<int,int> &b)
{
	return a.first<b.first;
}

int main()
{
	int N,i,j;
	long long ans;

	while (scanf("%d",&N),N)
	{
		for (i=0;i<N;++i)
		{
			scanf("%d",&A[i].first);
			A[i].second=i;
		}
		stable_sort(A,A+N,cmp);
		for (i=0;i<N;++i)
		{
			B[A[i].second]=i+1;
		}

		ans=0;
		memset(ar,0,sizeof(ar));
		for (i=0;i<N;++i)
		{
			add(B[i],1);
			ans+=i-sum(B[i]-1);
			//printf("%d ",B[i]);
		}
		memset(ar,0,(N+3)*sizeof(int));
		printf("%I64d\n",ans);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值