刚学,想法类似归并,请问哪里错了

P1908 逆序对

Hayya @ 2024-09-21 10:40:33

#include<bits/stdc++.h>
using namespace std;
int nxd(int a[],int l,int r)
{
    long long count;
    int mid=(l+r)/2,index=r;
    if(l>=r) return 0;
    count=count+nxd(a,l,mid)+nxd(a,mid+1,r);
    sort(a+l,a+mid+1,greater<int>());
    sort(a+mid+1,a+r+1,greater<int>());
    for(int i=mid;i>=l;i--)
    {
        for(int j=index;j>=mid+1;j--)
        {

        while(a[i]>a[j])
        {
            index--;
            count+=i-l+1;
        }

        }
    }
    return count;
}
int main()
{
    long long s;int b[500000];
    cin>>s;
    for(int k=0;k<s;k++)
    cin>>b[k];
    cout<<nxd(b,0,s-1);
    return 0; 
}

by kbzcz @ 2024-09-21 10:59:57

老哥,你运行一下你的代码行不。


by zhouzihang1 @ 2024-09-21 11:09:32

sort?


by Hayya @ 2024-09-21 11:18:29

@kbzcz 就是没输出才问啊


by Hayya @ 2024-09-21 11:19:51

@zhouzihang1 应该可以这样排序吧? 网上看到的,我不太懂


by zzbzwjx @ 2024-09-22 18:07:44

@Hayya 请尝试检查是否出现了无限递归


by zzbzwjx @ 2024-09-22 18:09:39

呸是死循环了


by zzbzwjx @ 2024-09-22 18:11:01

for(int i=mid;i>=l;i--)
    {
        for(int j=index;j>=mid+1;j--)
        {

        while(a[i]>a[j])
        {
            index--;
            count+=i-l+1;
        }

        }
    }

请先自行尝试解决此处的死循环问题


by Hayya @ 2024-09-22 23:26:07

@zzbzwjx 死循环改了,但是结果还是大得离谱,请问我这题想法有问题吗?改完代码如下


for(int i=mid;i>=l;i--)
    {
        for(int j=index;j>=mid+1;j--)
        {
        if(a[i]>a[j])
        {
            index--;
            count+=i-l+1;
        }
        else break;
        }
    }

by zzbzwjx @ 2024-09-23 21:09:36

@Hayya 不是你这怎么越改越离谱啊,死循环不是你这么改的啊,你应该检查的是你设置的条件、循环内部 和整体逻辑是否有问题,而不是单纯为了解决这一处死循环而改动


|