离散化+树状数组
查看原帖
离散化+树状数组
517637
瀛洲仙子楼主2023/7/29 10:05

求助:为什么一个点都不对?

#include<bits/stdc++.h>
using namespace std;
//typedef long long lld;
struct var
{
    int val;
    int id;
    var(){}
};
bool cmp(var a,var b)
{
    if(a.val==b.val)
        return a.id<b.id;
    return a.val<b.val;
}
var a[500005];int n;
int c[500005];
int arr[500005];
int lowbit(int x)
{return x&-x;}
void update(int pos)
{
    while(pos<=500005)
    {
        ++c[pos];
        pos+=lowbit(pos);
    }
}
int summ(int pos)
{
    int ret=0;
    while(pos)
    {
        ret+=c[pos];
        pos-=lowbit(pos);
    }
    return ret;
}
int main()
{
    cin>>n;//输入
    for(int i=1;i<=n;++i)
    {
        cin>>a[i].val;
        a[i].id=i;
    }
    //离散化
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;++i)
    {
        a[i].val=i;
        arr[a[i].id]=a[i].val;
    }
    //树状数组
    int ans=0;
    for(int i=1;i<=n;++i)
    {
        update(arr[i]);
        ans+=summ(arr[i-1]);
    }
    cout<<n*(n-1)/2-ans;
}
2023/7/29 10:05
加载中...