列表

详情


NC215119. CoolCool的序列

描述

Cg特别喜欢翻转序列!

跨年夜也要继续翻转!

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

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



询问oxy最少花费多少对Cg的 进行操作 可以得到Cg的 呢?

输入描述

一个整数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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 102ms, 内存消耗: 68600K, 提交时间: 2021-04-10 10:47:59

#include<bits/stdc++.h>
using namespace std;
int a[1000005];
queue<int>que[100005];
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		que[a[i]].push(i);
	}
	long long int ans=0;
	for(int i=n;i>=1;i--){
		ans+=abs(que[a[i]].front()+i-n-1);
		que[a[i]].pop();
	}
	cout<<ans/2;
} 

Python3(3.9) 解法, 执行用时: 222ms, 内存消耗: 20832K, 提交时间: 2021-02-02 10:42:15

n = int(input())
a = list(map(int, input().split()))
pos = [list() for _ in range(n + 1)]
for i in range(n):
    pos[a[i]].append(i)
ans = 0
for i in pos:
    j = [n - 1 - k for k in i][::-1]
    for k in range(len(i)):
        ans += abs(i[k] - j[k])
print(ans // 2)

上一题