CoolCool的序列

链接:https://ac.nowcoder.com/acm/contest/9854/G
来源:牛客网

Cg特别喜欢翻转序列!

跨年夜也要继续翻转!

现在有一个长度为n的序列s,Cg将其翻转之后变成了t。

路过的oxy发现了这个t序列,但是oxy不可以直接将序列翻转,她只可以执行一种操作:

选择任意的两个数a_i和a_j(j>i),花费j-i将两数位置交换选择任意的两个数a
i

和a
j

(j>i),花费j−i将两数位置交换

询问oxy最少花费多少对Cg的 s 进行操作 可以得到Cg的 t 呢?
输入描述:
一个整数N,代表序列的长度,(1<=N<=100000)
接下来N个整数代表序列s,1<=a_i <= N
输出描述:
oxy的最小花费~
示例1
输入
复制
4
1 2 3 4
输出
复制
4
说明
翻转之后t = {4,3,2,1},只需要交换1 4 与 2 3 便可得到 4 3 2 1,花费为4
示例2
输入
复制
5
1 1 2 3 1
输出
复制
2
说明
翻转之后t = {1,3,2,1,1}
s = {1,1,2,3,1},交换2 4之后 s = {1,3,2,1,1}
所以花费为2

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
#define x first
#define y second
typedef __int128 INT;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int N = 1e1 + 10;
const int Mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int P = 13331;
int a[N], b[N];
queue<int> ver[N];
int main(){
     
		int n;
		scanf("%d", &n);
				for (int i = 1; i <= n; i ++)       scanf("%d", &a[i]);
				for (int i = 1; i <= n; i ++){
     
			b[i] = a[n - i + 1];
			ver[b[i]].push(i);
		}
				int ans = 0;
				for (int i = 1; i <= n; i ++){
     
			int x = ver[a[i]].front();
			ver[a[i]].pop();
						//cout << x - i << "--------" << endl;
			ans += abs(x - i);
		}
				ans /= 2;
				cout << ans << endl;
		return 0;
}

你可能感兴趣的:(补题)