(Day15) 算法复健运动for蓝桥杯-分治&归并排序
(Day14) 算法复健运动for蓝桥杯-分治&归并排序
分而治之,个人理解就是类似递归,就是把大问题转化为子问题,然后一步步解决的
例子:
归并排序讲解:
https://www.cnblogs.com/chengxiao/p/6194356.html
就是先用递归把数字分开,然后再按照顺序把两头合并。用双指针合并
归并排序找逆序对:
例题:https://www.luogu.com.cn/problem/solution/P1908
用ij双指针排查的时候,找到顺序是逆序的
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+9;
int a[N];
int c[N];
ll ans=0;
void msort(int l,int r)
{
if(l==r)
return ;
int mid=(l+r)/2;
msort(l,mid);
msort(mid+1,r);
int i=l,j=mid+1;
int num=l;
while(i<=mid&&j<=r)
{
if(a[i]<=a[j])
{
c[num++]=a[i++];
}
else
{
c[num++]=a[j++];
ans+=(ll)(mid-i+1);//(i~mid)范围内都是大于a[j]的
}
}
while(i<=mid)
c[num++]=a[i++];
while(j<=r)
c[num++]=a[j++];
for(int k=l;k<=r;k++)
{
a[k]=c[k];
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
msort(1,n);
printf("%lld\n",ans);
return 0;
}

浙公网安备 33010602011771号