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
大写的服字