제출 #222843

#제출 시각아이디문제언어결과실행 시간메모리
222843rama_pangArranging Shoes (IOI19_shoes)C++14
100 / 100
125 ms15856 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;

class BIT {
 private:
  vector<int> tree;

 public:
  BIT() {}
  BIT(int n) { tree.assign(n, 0); }

  void Update(int p, int x) {
    for (int i = p + 1; i <= tree.size(); i += (i & -i)) {
      tree[i - 1] += x;
    }
  }

  int Query(int p) {
    int res = 0;
    for (int i = p + 1; i > 0; i -= (i & -i)) {
      res += tree[i - 1];
    }
    return res;
  }
};

long long count_swaps(vector<int> S) {
  int N = S.size() / 2;
  vector<vector<int>> ShoeSizeLeft(N + 1);
  vector<vector<int>> ShoeSizeRight(N + 1);
  vector<pair<int, int>> arrange;

  for (int i = 0; i < 2 * N; i++) {
    if (S[i] < 0) { // Left Shoe
      ShoeSizeLeft[-S[i]].emplace_back(i);
    } else { // Right Shoe
      ShoeSizeRight[S[i]].emplace_back(i);
    }
  }

  long long Answer = 0;

  for (int i = 1; i <= N; i++) {
    for (int j = 0; j < (int) ShoeSizeLeft[i].size(); j++) {
      arrange.emplace_back(ShoeSizeLeft[i][j], ShoeSizeRight[i][j]);
      if (arrange.back().first > arrange.back().second) {
        swap(arrange.back().first, arrange.back().second); // Swap Left and Right Shoe
        Answer++;
      }
    }
  }

  BIT tree(2 * N);
  for (int i = 1; i < 2 * N; i++) {
    tree.Update(i, 1);
  }

  sort(begin(arrange), end(arrange));  
  for (int i = 0; i < N; i++) {
    int L = arrange[i].first;
    int R = arrange[i].second;
    Answer += tree.Query(L);
    Answer += tree.Query(R) - 1;

    // Move position L to 0
    tree.Update(0, 1);
    tree.Update(L, -1);

    // Delete position R to 1
    tree.Update(1, 1);
    tree.Update(R, -1);

    // Delete position 0 and 1
    tree.Update(0, -2);
  }

  return Answer;
}

컴파일 시 표준 에러 (stderr) 메시지

shoes.cpp: In member function 'void BIT::Update(int, int)':
shoes.cpp:14:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = p + 1; i <= tree.size(); i += (i & -i)) {
                         ~~^~~~~~~~~~~~~~
#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...