ykmakuのブログ

競技プログラミングをがんばるブログ

AtCoder Grand Contest 003 C - BBuBBBlesort!

  • 問題

beta.atcoder.jp

  • 解法

B = \{a_0,a_2,a_4,\dots\} ,\ C = \{a_1,a_3,a_5,\dots\}とすると操作2のみでソートしようとする場合、B,Cそれぞれの中でバブルソートをしていることになる。つまり操作1を行う必要があるのはBの要素とCの要素を入れ替えたいときだけである。
操作1を行う回数を求めるにはAをソートしたものをA^{\prime}とすればAでのindexが奇数であってA^{\prime}でのindexが偶数であるものの個数を求めれば良い。

#include <iostream>
#include <string>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <numeric>
#include <cmath>

using namespace std;

typedef long long int ll;

#define all(x) x.begin(),x.end()

int main()
{
  int n;
  cin >> n;
  vector<int> a(n);
  for(int i = 0; i < n; i++){
    cin >> a[i];
  }
  vector<int> sorted = a;
  sort(all(sorted));

  set<int> even,odd;
  for(int i = 0; i < n; i++){
    if(i%2 == 0) even.insert(sorted[i]);
    else odd.insert(sorted[i]);
  }

  int ans = 0;
  for(int i = 0; i < n; i++){
    if(i % 2 != 0){
      if(even.count(a[i]) > 0) ans++;
    }
  }

  cout << ans << endl;

  return 0;
}