Description
一天Murphyc从睡梦中醒来,发现自己居然穿越到了弹丸论破的世界。作为原作全成就通关的超高校级Gamer,Murphyc很清楚接下来会发生什么。为了中止Chiaki即将面临的“学级裁判”,Murphyc溜进了未来机关内部,但是只有持有特定编号的识别卡才能进入机关控制室。
好在,Murphyc其实还有另一重身份----法师学徒!虽然Murphyc手中只有门口警卫的识别卡,但机智的他发现该警卫的识别卡编号只要经过若干次Magic操作便可变为原作CG中某重要角色Chisa的的识别码。
Magic操作:对于i与j位置的两个数字你可以消耗|i-j|的魔力值以交换两个数字的位置。
例如
现在已知警卫的识别码为一个长度为n的整数序列a,ai<=n, Chisa的识别码为长度为n的整数序列b,bi<=n,并且,a、b序列均为[1,n]的全排列之一.为了节约魔力,请问Murphyc至少要消耗多少魔力才能获得Chisa的识别码?
Input
第一行一个数字T代表测试的组数(T<=20)
对于每组测试,第一行一个数字n代表序列的长度(n<=2e5)
接下来一行有n个数字a1,a2,a3….an(1<=ai<=n)
接下来一行有n个数字b1,b2,b3…bn(1<=bi<=n)
Output
对于每行输出一个整数
Sample Input
1
4
2 3 4 1
1 3 4 2
Sample Output
3
C++版本一
题解:
本题改编自Codeforces Round #324 (Div. 2)
http://codeforces.com/contest/584/problem/E
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[200005],b[200005];
int conv[200005];
int main()
{
freopen("stdin.txt","r",stdin);
freopen("stdout.txt","w",stdout);
int zu;
scanf("%d",&zu);
while(zu--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),conv[a[i]]=i;
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
ll ans=0;
for(int i=1;i<=n;i++) ans+=abs(i-conv[b[i]]);
printf("%lld\n",ans/2);
}
}
C++版本二
题解:
类似题解一
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <cmath>
#include <queue>
using namespace std;
typedef long long ll;
const int N=2e5+100;
int t,n,m;
int a[N],b[N],c[N],w[N];
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
w[a[i]]=i;
}
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
c[i]=w[b[i]];
}
int sum=0;
for(int i=1;i<=n;i++){
if(i>c[i])
sum+=i-c[i];
}
cout << sum << endl;
}
//cout << "Hello world!" << endl;
return 0;
}