25分求助

P1908 逆序对

kxbb @ 2022-08-29 19:18:34

#include<bits/stdc++.h>
using namespace std;
int const N=500010;
int a[N]={};
long long ans=0;
void hb(int a1,int a2,int b1,int b2)
{
    int b[N]={};
    int lena=a1;
    int lenb=b1;
    int len=1;
    while(1)
    {
        if(lena>a2)
        {
            for(int i=lenb;i<=b2;i++)
            {
                b[len]=a[i];
                len++;
            }
            break;
        }
        if(lenb>b2)
        {
            for(int i=lena;i<=a2;i++)
            {
                b[len]=a[i];
                len++;
            }
            break;
        }
        if(a[lena]<=a[lenb])
        {
            b[len]=a[lena];
            lena++;
            len++;
        }
        else
        {
            ans+=a2-lena+1;
            b[len]=a[lenb];
            lenb++;
            len++;
        }
    }
    for(int i=a1;i<=b2;i++)//a,b 合并 
    {
        a[i]=b[i-a1+1];
    }
    return;
}
void gb(int head,int tail)
{
    if(tail-head==0)    return;
    int mid=head+tail;
    mid=mid/2;
    gb(head,mid);
    gb(mid+1,tail);
    hb(head,mid,mid+1,tail);
}
int main()
{
    int x;
    scanf("%d",&x);
    for(int i=1;i<=x;i++)
        scanf("%d",&a[i]);
    gb(1,x);
    printf("%lld",ans);
    return 0;
}
//5 4 2 6 3 1 

N改成100010就50分 莫名其妙。。


by bamboo12345 @ 2022-08-29 19:25:27

@kxbb 你不要每次合并就重开一个数组,很耗时间的


by kxbb @ 2022-08-29 19:46:03

@bamboo123 ok谢谢,ac了

追问下:为啥之前的N改成100010可以50分


by OoXiao_QioO @ 2022-08-29 19:46:18

@kxbb 把hb函数里的b数组拖到全局ac


by kxbb @ 2022-08-29 19:49:06

@OoXiao_QioO 追问下:为啥之前的N改成100010可以50分


by kxbb @ 2022-08-29 19:49:58

是数据规模变小了就减小时耗吗


by OoXiao_QioO @ 2022-08-29 19:51:56

@kxbb for(int i=a1;i<=b2;i++)//a,b 合并 这里是不是就容易越界,从而tle或re


by kxbb @ 2022-08-29 19:56:25

@OoXiao_QioO 把b数组拉出来就过了,tle就是b数组的重复开,之前的re是我N开错了我眼瞎


by CharlieLee @ 2022-08-29 20:35:54

大写的服字


|