我用树状数组做的,原代码如下:
#include <iostream>//树状数组做法
#include <cstdio>
#include <algorithm>
#define lowbit(i) i&(-i)
#define ll long long
using namespace std;
const int M=5e5+1;
int n,a[M],z[M],s[M];
ll ans=0;
void modify(int x)
{
for(int i=x; i<=n; i+=lowbit(i)) s[i]++;
}
ll query(int x)
{
ll sum=0;
for(int i=x; i>0; i-=lowbit(i)) sum+=s[i];
return sum;
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; ++i) scanf("%d",&a[i]),z[i]=a[i];
sort(z+1,z+n+1);
int h=unique(z+1,z+n+1)-z;
for(int i=1; i<=n; ++i)
{
int k=lower_bound(z+1,z+h+1,a[i])-z;
ans+=query(n)-query(k);
modify(k);
}
printf("%lld",ans);
return 0;
}
这个代码在P1908 逆序对能拿满分,但在本题只有90,WA #3。
测试点3输出是
252324
我的代码输出是
251794
在经过我的一番乱搞调试之后,我发现将原代码倒数第七行的
int k=lower_bound(z+1,z+h+1,a[i])-z;
改为
int k=lower_bound(z+1,z+h+2,a[i])-z;
即可AC。
所以为什么会这样?是我unique用的不对吗?该怎么用?
这不算讨论区题解吧违者紫衫