#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int a[262146],a1[262146],a2[262146];
int read()//快读
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=x*10+ch-48,ch=getchar();}
return x*f;
}
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])//合法
{
int m=solve(l,mid),n=solve(mid+1,r);
if(m==-1||n==-1) return -1;
return m+n;
}
if(a2[k-1]<a1[1])//合法
{
int m=solve(l,mid),n=solve(mid+1,r);
if(m==-1||n==-1) return -1;
return m+n+1;//多进行一次交换
}
return -1;//如果不合法
}
int main()
{
int x;
x=read();
while(x--)
{
int n=read();
int sum=0;//每次重置结果
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++) a[i]=read();
cout<<solve(1,n)<<endl;
}
return 0;
}
——————分割线——————————————
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int a[262146],a1[262146],a2[262146];
int read()//快读
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=x*10+ch-48,ch=getchar();}
return x*f;
}
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 main()
{
int x;
x=read();
while(x--)
{
int n=read();
int sum=0;//每次重置结果
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++) a[i]=read();
cout<<solve(1,n)<<endl;
}
return 0;
大佬们求救啊,我脑袋要想爆了都不明白为什么不一样,第一段代码是对的