luogu P1908逆順|フェンウィックツリー

タイトル説明

JERRY TOM猫とマウスのコンテスト最近、しかし、すべての後、彼らは成人している、彼らはゲームを開始するの一種でプレイしているのが好きではありません、そして今、彼らは統計をプレイしたいです。最近では、人間へのTOM猫は今、「逆順」何か、と定義されると呼ばれるもの:正の整数期間の所定の配列については、逆にして、AJ I <jは、AIの順序付けられたシーケンスです>右。この概念を知ること、誰でも彼らが与えられた期間に一致することは逆の順序で配列の正の整数値を算出します。
更新:データは強化されています。

入力形式

最初の行、数nは、シーケンス番号nがあります。

第二行数n、所与の配列。各シーケンス番号は超えていない10 ^ 9

出力フォーマット

逆シーケンスの所定数。

説明/ヒント

データの25%、n≤2500

データの50%については、n≤4×10 ^ 4

すべてのデータ、n≤5×10 ^ 5の場合

より高速な入出力を使用してください

Nはchen_zhe 50万平方バーの上にすべきではありません


#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
const int N=5e5+10;
#define int long long
using namespace std;
int c[N],n,a[N],b[N];
inline void add(int x,int y){
    for(;x<=n;x+=x&(-x))c[x]+=y;
}
inline int sum(int x){
    int ans=0;
    for(;x;x-=x&(-x))ans+=c[x];
    return ans;
}
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        b[i]=a[i];
    }
    sort(b+1,b+1+n);
    int len=unique(b+1,b+1+n)-b-1;
    for(int i=1;i<=n;i++)
    a[i]=lower_bound(b+1,b+1+len,a[i])-b;
    int ans=0;
    for(int i=n;i>=1;i--){
        ans+=sum(a[i]-1);
        add(a[i],1);
    }
    cout<<ans<<endl;
}

おすすめ

転載: www.cnblogs.com/naruto-mzx/p/11848650.html