社区讨论
关于“动态开点树状数组”
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 条回复,欢迎继续交流。
正在加载回复...