CoolCool的序列 ###K //K

题目链接:https://ac.nowcoder.com/acm/contest/9854/G

思路: 不需要考虑交换的顺序 只需要考虑最终每个数字的变化位置即可,总能找到一种方案

使得每个数字都一次就能交换到自己想要的位置  记录自己当前位置和翻转后的位置,只需要

当前位置的从小到大一个个数和翻转后的从小到大的一个个数匹配即可

因为一半的数重复交换了两次所以ans 要/=2

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define pb push_back
 4 using namespace std;
 5 const int maxn=1e5+10;
 6 const int mod=1e9+7;
 7 queue<int>q[maxn];
 8 int a[maxn];
 9 
10 
11 
12 
13 int main()
14 {
15     ios::sync_with_stdio(0);
16     cin.tie(0);
17     int n;
18     cin>>n;
19     for(int i=1;i<=n;i++)
20     {
21         cin>>a[i];
22         q[a[i]].push(i);
23     }
24     ll ans=0;
25     for(int i=n;i>=1;i--)
26     {
27         int x=n-i+1;
28         ans+=abs(x-q[a[i]].front());
29         q[a[i]].pop();
30     }
31     ans/=2;
32     cout<<ans<<'\n';
33 
34 
35 
36 
37 
38 
39 }
View Code

 

posted @ 2021-01-02 13:18  canwinfor  阅读(164)  评论(0)    收藏  举报