제출 #1313934

#제출 시각아이디문제언어결과실행 시간메모리
1313934voldi9Arranging Shoes (IOI19_shoes)C++20
0 / 100
1 ms332 KiB
#include "shoes.h"
#include <cstdio>
#include <vector>
#include <deque>
#include <cmath>
#include <bit>
#include <unordered_map>

using namespace std;

void inline update(vector<int>& removed, int pos) {
  while (pos > 1)
    removed[pos>>=1]++;
}

int inline sum(vector<int>& removed, int i, int j) {
  int res = 0;
  while (i >> 1 < j >> 1) {
    if ((i % 2) == 0)
      res += removed[i+1];
    if ((j % 2) == 1)
      res += removed[j-1];
    i >>= 1;
    j >>= 1;
  } 
  return res;
}

long long count_swaps(std::vector<int> S) {
  long long res = 0;
  unordered_map<int, deque<int>> sizes[2];
  int N = bit_ceil(S.size());
  vector<int> removed(2*N, 0);

  for (int i=0; i<S.size(); i++)
     S[i] < 0 ? sizes[0][-S[i]].push_back(i) : sizes[1][-S[i]].push_back(i);

  for (int i=0; i<S.size(); i++) {
    if (sizes[S[i] > 0][abs(S[i])].front() > i)
      continue;
    int j = sizes[(S[i] < 0)][abs(S[i])].front();
    sizes[(S[i] < 0)][abs(S[i])].pop_front();
    sizes[(S[i] > 0)][abs(S[i])].pop_front();
    res += j - i - sum(removed, N+i, N+j);
    update(removed, N+j);
    if (S[i] < 0) res--;
  }
  return res;
}

// int main() {
//  printf("%lld", count_swaps({2,1,-1,-2}));
// }
#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...