求调 为什么升序可以A 但降序不能

P1908 逆序对

czy032321054 @ 2024-07-31 17:43:09

降序代码,样例都过不了:

#include<bits/stdc++.h>
using namespace std;
int a[500005],n;
long long ans;
bool cmp(int x,int y){
    return x>y;
}
void mt(int l,int r){
    if(l>=r)return;
    int mid=(l+r)>>1;
    mt(l,mid);
    mt(mid+1,r);
    sort(a+l,a+mid+1,cmp);
    sort(a+mid+1,a+r+1,cmp);
    int i=l,j=mid+1;
    while(i<=mid&&j<=r)
        if(a[i]>a[j])
            i++;
        else
            j++,ans+=i-l;//统计答案 
}
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    mt(0,n-1);
    cout<<ans;
}

升序代码 已A:

#include<bits/stdc++.h>
using namespace std;
int a[500005],n;
long long ans;
void mt(int l,int r){
    if(l>=r)return;
    int mid=(l+r)>>1;
    mt(l,mid);
    mt(mid+1,r);
    sort(a+l,a+mid+1,);
    sort(a+mid+1,a+r+1);
    int i=l,j=mid+1;
    while(i<=mid&&j<=r)
        if(a[i]<=a[j])
            i++;
        else
            j++,ans+=mid-i+1;//统计答案 
}
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    mt(0,n-1);
    cout<<ans;
}

|