逆序对+离散树状数组+。。。。

Posted ckxkexing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逆序对+离散树状数组+。。。。相关的知识,希望对你有一定的参考价值。

求逆序对有三种以上方法:1、离散树状数组,2、线段树,3、归并排序

今天做了下洛谷的P1908逆序对;

1、一开始用树状数组,一直RE,后来在发现自己一直忽略离散化。

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 400000+5;
typedef long long ll;
ll n,Hash[maxn],bt[maxn];
struct node {
    int v,id;
}a[maxn];
ll lowbit(ll x)
{
    return (x)&(-x);
}

void add(ll i,ll b)
{
    while(i<=n)
    {
        bt[i]+=b;
        i+=lowbit(i);
    }
}

ll qu(ll i)
{
    ll ans=0;
    while(i>0)
    {
        ans+=bt[i];
        i-=lowbit(i);
    }
    return ans;
}
bool cmp(node a,node b)
{
    return a.v<b.v;
}
int main(){
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>a[i].v;
        a[i].id=i;
    }
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
        Hash[a[i].id]=i;
    }
    //离散化结束;
    ll sum = 0;
    for(int i=1;i<=n;i++)
    {
        sum+=(i-1-qu(Hash[i])); //当前树状数组中有i-1个,quary(a[i])前缀和查出a[i]前的个数
        add(Hash[i],1);          //值为a[i]的数又增加了一个
    }
    cout<<sum<<endl;
    return 0;
}

 

以上是关于逆序对+离散树状数组+。。。。的主要内容,如果未能解决你的问题,请参考以下文章

SGU180(树状数组,逆序对,离散)

Poj 2299 - Ultra-QuickSort 离散化,树状数组,逆序对

CCPC河南省赛B-树上逆序对| 离线处理|树状数组 + 线段树维护逆序对 + dfs序 + 离散化

cf1042d 树状数组逆序对+离散化

Codeforces Round #301 (Div. 2) E. Infinite Inversions —— 逆序对 离散化 + 树状数组

bzoj5055膜法师(离散化+树状数组)