关于unique的使用
查看原帖
关于unique的使用
501732
enend0楼主2022/10/14 15:31

我用树状数组做的,原代码如下:

#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用的不对吗?该怎么用?

这不算讨论区题解吧违者紫衫

2022/10/14 15:31
加载中...