linkkk
题意:
将
1
−
2
n
1-2n
1−2n的奇数任意顺序放到
a
a
a数组,偶数任意顺序放到
b
b
b数组。每次可以交换某数组的相邻两项,问
a
<
b
a<b
a<b的最小操作次数。
思路:
元素互不相同,比较第一个就行。
每次可以只移动
a
a
a中元素或
b
b
b中元素或两者都移动,考虑怎么计算最优。
枚举
a
,
b
a,b
a,b的首元素是哪个就可以了。
用
m
a
p
map
map表示将
a
i
a_i
ai移动到首位需要的次数。
从
2
n
2n
2n倒着遍历,遇到奇数的话更新答案,遇到偶数的话更新将元素移动到首位的最小次数,由于是倒着枚举,所以对于奇数来说,后面的偶数比他大,次数还小,所以一定满足
a
<
b
a<b
a<b
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10,inf=0x3f3f3f3f;
int a[maxn],b[maxn];
map<int,int>mp;
int main(){
int _;cin>>_;
while(_--){
int n;cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],mp[a[i]]=i-1;
for(int i=1;i<=n;i++) cin>>b[i],mp[b[i]]=i-1;
int ans=inf,res=inf;
for(int i=2*n;i;i--)
if(i&1) ans=min(ans,mp[i]+res);
else res=min(res,mp[i]);
cout<<ans<<endl;
}
return 0;
}
/*
3
3 5 1
2 4 6
*/