萌新30分求调

P1908 逆序对

gaojizhe05 @ 2023-11-16 10:02:10

问题

用了归并排序,但只有30分,一堆WA,请求大佬帮助!

错误代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=5e5;
int n,a[maxn],b[maxn],ans=0;
void Init(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
}
void Do(int x,int y,int z,int w){
    if(z>n) return;
    int cnt=0;
    int p=x,q=z;
    for(int i=x;i<=w;i++){ 
        if(a[p]<a[q]){
            b[i]=a[p];
            p++;
            ans+=cnt;
            if(p>y){
                for(int j=i+1,k=q;j<=w;j++,k++)
                    b[j]=a[k];
                break;
            }
        }
        else if(a[p]>a[q]){
            b[i]=a[q];
            cnt++;
            q++;
            if(q>w){
                for(int j=i+1,k=p;j<=w;j++,k++){
                    b[j]=a[k];
                    ans+=cnt;

                }
                break;
            }
        }
    }
    for(int i=x;i<=w;i++)
        a[i]=b[i];
}
void Work(){
    for(int i=1;i<=n;i*=2)
        for(int j=1;j<=n;j+=i*2)
            Do(j,j+i-1,i+j,min(j+i*2-1,n));
    cout<<ans;
}
int main(){
    Init();
    Work();
    return 0;
}

|