题意:p串变成s串所需要的最小代价。
分析:本题可以贪心,但过程较多。其实本题为一个经典题目的变形,将一个数字串变为有序的最小次数;1.如果交换只能是临近的那么次数为序列的逆序数。
2.如果交换为任意两数,那么次数为n-循环节个数。
那么什么是循环节啦?比如对于队列1 3 5 7 9 对应变为序列 1 5 7 9 3 循环节就为两个,单独的1和 3-5-7-9 意思说对于该队列要将前变为后至少要变换3次。
可以发现的是对于交换代价对于一个循环节无论怎样的先后方式它所产生的代价是一样的。所以对于本题只需统计循环节转移的长度即可。对于单点则为0 .
所以只需要记录下p_i对应到p_j的距离由于是交换所以代价是总代价的1/2.
注意使用longlong.
#include <bits/stdc++.h>
using namespace std;
#define LL __int64
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i < n; ++i)
const int qq = 2e5 + 10;
int num[qq];
bool vis[qq];
int main(){
int n; scanf("%d", &n);
for(int i = 1; i <= n; ++i){
int x; scanf("%d", &x);
num[x] = i;
}
LL ans = 0;
for(int i = 1; i <= n; ++i){
int x; scanf("%d", &x);
ans += abs(i - num[x]);
}
printf("%I64d\n", ans / 2);
return 0;
}