树状数组加离散化!为什么只有十分?
查看原帖
树状数组加离散化!为什么只有十分?
298402
cccyyylll888楼主2022/7/12 14:44
#include<bits/stdc++.h>
using namespace std;
long long s[5000005];
long long n;
long long t[5000005];
struct pai{
	long long num,pm;
}p[5000005];
long long lowbit(long long i)//最小的1的位置
{
	return i&(-i); 
} 
void update(long long i,long long x)//在s[i]以及上层数组上加上x 
{
	for(i;i <= n;i += lowbit(i))
	{
		s[i] += x;
	}
} 
long long query(long long i)
{
	long long ans = 0;
	for(i;i > 0;i -= lowbit(i))
	{
		ans += s[i];
	}
	return ans;
}
bool cmp(pai b,pai c)
{
	if(b.num == c.num)
	return b.pm < c.pm;
	return b.num < c.num;
}
int main()
{
	cin >> n;
	memset(s,0,sizeof(0));
	long long ans = 0;
	for(long long i = 1;i <= n;i++)
	{
		cin >> p[i].num;
		p[i].pm = i; 
	}
	sort(p+1,p+n+1,cmp);
	for(int i = 1;i <= n;i++)
	{
		t[p[i].pm] = i;
	}
	for(long long i = 1;i <= n;i++)
	{
		update(t[i],1);
		ans += i - query(t[i]);
	} 
	cout << ans;
	return 0;
} 
2022/7/12 14:44
加载中...