线段树爆零求助

P1908 逆序对

Great_juruo @ 2022-02-06 21:15:28

#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int N=200001; 
int n,cnt,ans,sum[N*4];
struct node{
    int data,pos;
} a[N];
bool cmp(node x,node y){
    if(x.data!=y.data){
        return x.data>y.data;
    }else{
        return x.pos>y.pos;
    }
}
int query(int p,int l,int r,int ll,int rr){
    if(l>r) return 0;
    if(l<=ll&&rr<=r){
        return sum[p];
    }
    int mid=(ll+rr)/2;
    int res=0;
    if(l<=mid){
        res+=query(p*2,l,r,ll,mid);
    }
    if(mid<r){
        res+=query(p*2+1,l,r,mid+1,r);
    }
    return res;
}
void update(int p,int loc,int num,int l,int r){
    if(l==r){
        sum[p]+=num;
        return ;
    }
    int mid=(l+r)/2;
    if(loc<=mid){
        update(p*2,loc,num,l,mid);
    }else{
        update(p*2+1,loc,num,mid+1,r);
    }
    sum[p]=sum[p*2]+sum[p*2+1];
}
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i].data);
        a[i].pos=i;
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++){
        if(i!=1&&a[i].data==a[i-1].data){
            cnt++;
        }  else cnt=0;
        ans+=query(1,1,a[i].pos-1,1,n);
        ans-=cnt;
        update(1,a[i].pos,1,1,n);
    }
    cout<<ans;
    return 0;
} 

by Great_juruo @ 2022-02-06 21:16:02

调了一天了


by Xfer_splendor @ 2022-02-06 21:54:56

建议重打


|