제출 #420527

#제출 시각아이디문제언어결과실행 시간메모리
420527SSRSArranging Shoes (IOI19_shoes)C++14
30 / 100
45 ms5444 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;
  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...