排列轉換

brucehb發表於2017-06-14

現在有兩個長度為n的排列ps。要求通過交換使得p變成s。交換 pi 和 pj 的代價是|i-j|。要求使用最少的代價讓p變成s


Input
單組測試資料。
第一行有一個整數n (1≤n≤200000),表示排列的長度。
第二行有n個範圍是1到n的整數,表示排列p。每個整數只出現一次。
第三行有n個範圍是1到n的整數,表示排列s。每個整數只出現一次。
Output
輸出一個整數,表示從排列p變到s最少要多少代價。
Input示例
樣例輸入1
4
4 2 1 3
3 2 4 1
Output示例
樣例輸出1
3

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int a[200001];
int target[200001];

int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    
    int v;
    for (int i = 0; i < n; i++)
    {
        cin >> v;
        target[v] = i;
    }
    
	long long int result = 0;
	for (int i = 0; i < n; i++)
	{
	    result += abs(i - target[a[i]]);
	}
	result /= 2;
	cout << result << endl;

    return 0;
}


相關文章