这个题一定要离散化吗?
查看原帖
这个题一定要离散化吗?
1084316
O_Yeee楼主2025/7/21 16:06

单纯的记住左右两边小于的元素个数不就行了吗?(这个应该不是题解中那个类似离散化(?)的东西吧)

#include <bits/stdc++.h>
#define N 100005
#define ll long long
using namespace std;
ll n,maxval;
ll a[N],le[N],rig[N],bl[N],br[N];
ll lowbit(ll x){
    return (x&(-x));
}
void add(ll b[],int x,int y){
    while(x<=maxval){
        b[x]+=y;
        x+=lowbit(x);
    }
}
ll query(ll b[],int x){
    ll res=0;
    while(x>0){
       res+=b[x];
       x-=lowbit(x); 
    }
    return res;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin >> n;
    for(int i=1;i<=n;i++){
        cin >> a[i];
        maxval=max(maxval,a[i]);
    }
    for(int i=1;i<=n;i++){
        le[i]=query(bl,a[i]-1);
        add(bl,a[i],1);
    }
    for(int i=n;i>=1;i--){
        rig[i]=query(br,maxval)-query(br,a[i]);
        add(br,a[i],1);
    }
    ll ans=0;
    for(int i=1;i<=n;i++){
        ans+=(le[i]*rig[i]);
    }
    cout << ans;
    return 0;
}
2025/7/21 16:06
加载中...