int solve(int l,int r)
{
if(l==r) return 0;
int mid=(l+r)/2;
int k=1,j=1;
//分别复制左半边数组和右半边数组
for(int i=l;i<=mid;i++) a1[j++]=a[i];
for(int i=mid+1;i<=r;i++) a2[k++]=a[i];
//分别对两边排序,看看有没有解
sort(a1+1,a1+k);sort(a2+1,a2+k);
//如果一部分的最大值小于另外一个部分的最小值
if(a1[j-1]<a2[1]||a2[k-1]<a1[1])//合法
{
int m=solve(l,mid),n=solve(mid+1,r);
if(m==-1||n==-1) return -1;
if(a1[j-1]<a2[1])//如果左边的最大值小于右边的最小值
return m+n;
if(a2[k-1]<a1[1])//如果右边的最大值小于左边的最大值
return m+n+1;//多进行一次交换
}
return -1;//如果不合法
}
------------------分割线----------------------
int solve(int l,int r)
{
if(l==r) return 0;
int mid=(l+r)/2;
int k=1,j=1;
//分别复制左半边数组和右半边数组
for(int i=l;i<=mid;i++) a1[j++]=a[i];
for(int i=mid+1;i<=r;i++) a2[k++]=a[i];
//分别对两边排序,看看有没有解
sort(a1+1,a1+k);sort(a2+1,a2+k);
//如果一部分的最大值小于另外一个部分的最小值
if(a1[j-1]<a2[1]||a2[k-1]<a1[1])//合法
{
int m=solve(l,mid),n=solve(mid+1,r);
if(m==-1||n==-1) return -1;
if(a1[j-1]<a2[1])//如果左边的最大值小于右边的最小值
return m+n;
if(a2[k-1]<a1[1])//如果右边的最大值小于左边的最大值
return m+n+1;//多进行一次交换
}
return -1;//如果不合法
}
大佬们帮我看看有啥逻辑区别