struct team {
int a,b,id;
bool operator < (const team &A) const {
return a<A.a||(a==A.a&&b<A.b)||(a==A.a&&b==A.b&&id<A.id);
}
};
int main() {
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
tt=1;
cin>>tt;
while(tt--) {
cin>>n;
vector<team> a(n+1);
vector<int> b(n+1),c(n+1);
rep(i,1,n) b[i]=i,c[i]=i;
rep(i,1,n) {
cin>>a[i].a;
a[i].id=i;
}
rep(i,1,n) {
cin>>a[i].b;
}
sort(a.begin()+1,a.end());
int o=1;
for(int i=1;i<=n;++i) if(a[i].b<a[i-1].b) o=0;
if(!o) {
cout<<-1<<'\n';
continue;
}
vector<pair<int,int>> ans;
rep(i,1,n) {
if(b[i]!=a[i].id) {
ans.pb({i,c[a[i].id]});
c[b[i]]=c[a[i].id];
swap(b[i],b[c[a[i].id]]);
//for(int i=1;i<=n;++i) cout<<b[i]<<' '; cout<<'\n';
}
}
/*
排序后的a就是答案所求数组
example3 排序后为 3 1 4 2
所以只要把1 2 3 4重新排下转3 1 4 2即可
我们用b表示前i个排好后的数组状态
1 2 3 4->3 2 1 4
之后2需要和1交换位置,我们用c来记录j的位置,原来c1=1->c1=3
之后交换b数组i和c[a[i].id]位置即可
复杂度O(nlogn)
*/
cout<<ans.size()<<'\n';
for(auto &x:ans) {
cout<<x.first<<' '<<x.second<<'\n';
}
}
return 0;
}
Educational Codeforces Round 129 (Rated for Div. 2) C题nlogn
最新推荐文章于 2024-08-10 07:14:43 发布