社区讨论

关于“动态开点树状数组”

P1908逆序对参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mhj973fi
此快照首次捕获于
2025/11/03 22:46
4 个月前
此快照最后确认于
2025/11/03 22:46
4 个月前
查看原帖
某一天突然写出来了以下求逆序对的代码,感觉时间复杂度没有问题,但是 TLE 了,求各位大佬证明时间复杂度。
CPP
#include<bits/stdc++.h>
#include<bits/extc++.h>
using namespace std;
#define lowbit(x) (x&-x)
int n,m;
long long ans;
__gnu_pbds::gp_hash_table<int,int> c;
int a[500005];
void add(int x,int v)
{
	for(;x<=m;x+=lowbit(x))	c[x]+=v;
}
int query(int x)
{
	if(!x)	return 0;
	int res=0;
	for(;x;x-=lowbit(x))
		if(c.find(x)!=c.end())res+=c[x];
	return res;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i],m=max(a[i],m);
	reverse(a+1,a+n+1);
	for(int i=1;i<=n;i++)
	{
		ans+=query(a[i]-1);
		add(a[i],1);
	}
	cout<<ans<<"\n";
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...