警示后人

P1908 逆序对

wjj255 @ 2022-07-21 18:03:45

#include<iostream>
using namespace std;
const int N=500005;
long long a[N],b[N],s;
void msort(int l,int r)
{
    if(l==r)return;
    long long mid=(l+r)/2;
    msort(l,mid);
    msort(mid+1,r);
    int i=l;int j=mid+1;int k=l;
    while(k<=r){
        if(j>r||i<=mid&&a[i]<a[j]){
            b[k++]=a[i++];
        }
        else{
            b[k++]=a[j++];
            s+=(long long)(mid-i+1);
        }
    }
    for(int i=l;i<=r;i++)a[i]=b[i];
}
int main()
{
    ios::sync_with_stdio(false);
    //freopen("P1908.in","r",stdin);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    msort(1,n);
    /*for(int i=1;i<=n;i++){
        cout<<a[i]<<' ';
    }*/
    cout<<s<<endl;
    return 0;
}

上述代码只有30分,但只要把

if(j>r||i<=mid&&a[i]<a[j])

改成

if(j>r||i<=mid&&a[i]<=a[j]){

就可以满分


by tottopoi @ 2022-07-26 09:10:14

区别就是第一种把相同的数字也当成了逆序数


by CultReborn @ 2022-07-28 15:52:44

%%%%%%%%%%%%%%%%%%%%%%%%


|