luogu P1908 역순 | 펜윅 트리

제목 설명

제리 톰 고양이와 마우스 경연 대회 최근 있지만, 모든 후, 그들은하지 않는 게임을 시작의 종류와 연주해야 좋아하나요, 성인, 그리고 지금은 통계를 재생 것을 좋아합니다. 최근, 인간에 TOM 고양이는 이제 "역순"뭔가로 정의된다 무엇인가라는 : 양의 정수 기간의 주어진 순서를 들어, 리버스 AJ 내가 <j는 인공 지능의 정렬 순서입니다> 좋아. 그들은 주어진 기간과 일치 누구든지이 개념을 아는 것은 반대 순서로 서열의 양의 정수를 계산한다.
업데이트 : 데이터가 강화되고있다.

입력 형식

첫 행, 숫자 N은 시퀀스 번호 N있다.

제 2 라인 수 (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