제출 #420529

#제출 시각아이디문제언어결과실행 시간메모리
420529SSRSArranging Shoes (IOI19_shoes)C++14
50 / 100
142 ms4248 KiB
#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000;
struct binary_indexed_tree{
  int N;
  vector<int> BIT;
  binary_indexed_tree(int N): N(N), BIT(N + 1, 0){
  }
  void add(int i, int x){
    i++;
    while (i <= N){
      BIT[i] += x;
      i += i & -i;
    }
  }
  int sum(int i){
    int ans = 0;
    while (i > 0){
      ans += BIT[i];
      i -= i & -i;
    }
    return ans;
  }
  int sum(int L, int R){
    return sum(R) - sum(L);
  }
};
long long count_swaps(vector<int> S){
  int n = S.size() / 2;
  if (n <= 8){
    vector<int> p;
    for (int i = 0; i < n * 2; i++){
      if (S[i] > 0){
        p.push_back(S[i]);
      }
    }
    sort(p.begin(), p.end());
    int ans = INF;
    while (true){
      map<int, queue<int>> Q;
      for (int i = 0; i < n; i++){
        Q[-p[i]].push(i * 2);
        Q[p[i]].push(i * 2 + 1);
      }
      vector<int> p2(n * 2);
      for (int i = 0; i < n * 2; i++){
        p2[i] = Q[S[i]].front();
        Q[S[i]].pop();
      }
      int cnt = 0;
      for (int i = 0; i < n * 2; i++){
        for (int j = i + 1; j < n * 2; j++){
          if (p2[i] > p2[j]){
            cnt++;
          }
        }
      }
      ans = min(ans, cnt);
      if (!next_permutation(p.begin(), p.end())){
        break;
      }
    }
    return ans;
  } else {
    for (int i = 0; i < n * 2 - 1; i++){
      assert(abs(S[i]) == abs(S[i + 1]));
    }
    int x = abs(S[0]);
    map<int, queue<int>> Q;
    for (int i = 0; i < n; i++){
      Q[-x].push(i * 2);
      Q[x].push(i * 2 + 1);
    }
    vector<int> p(n * 2);
    for (int i = 0; i < n * 2; i++){
      p[i] =  Q[S[i]].front();
      Q[S[i]].pop();
    }
    binary_indexed_tree BIT(n * 2);
    long long ans = 0;
    for (int i = 0; i < n * 2; i++){
      ans += BIT.sum(p[i], n * 2);
      BIT.add(p[i], 1);
    }
    return ans;
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...