Example
input
3
2
3 1
4 2
3
5 3 1
2 4 6
5
7 5 9 1 3
2 4 6 10 8
output
0
2
3
题意:
每次交换相邻的两个数,问两个数列共同交换多少次,可以使得第一个数列的首个数字小于第二个数列的首个数字,求最少的交换次数。
解析:
由题意得第一数列为1,3,5,7...n-1,第二个数列为2,4,6,8...n,所以我们记录每个数和其下标,然后排序。
因为对于某个a[ i ],b[ i ]及其后面的数都比它大,所以我们从后往前遍历,每次计算数组b当前 i 后面的最小值,然后维护答案即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int t,n,x,y;
int main(){scanf("%d",&t);while(t--){scanf("%d",&n);pair<int,int>a[n+1],b[n+1];for(int i=1;i<=n;i++){scanf("%d",&x);a[i]={x,i};}for(int i=1;i<=n;i++){scanf("%d",&x);b[i]={x,i};}sort(a+1,a+n+1);sort(b+1,b+n+1);int f=n+1,res=2*n+1;for(int i=n;i>0;i--){f=min(f,b[i].second);res=min(res,f-1+a[i].second-1);}printf("%d\n",res);}return 0;
}