Submission #226110

#TimeUsernameProblemLanguageResultExecution timeMemory
226110Haunted_CppArranging Shoes (IOI19_shoes)C++17
10 / 100
16 ms11904 KiB
#include <bits/stdc++.h>
#include "shoes.h"

using namespace std;

const int N = 2e5 + 5;
bitset<2 * N> is_valid;

struct FenwickTree {
  vector<int> bit;
  const int N;
  FenwickTree (int n) : N (n + 5) {
    bit.clear (); bit.resize (N);
  }
  void update (int idx, int delta) {
    for (; idx < N; idx += idx & (- idx)) {
      bit[idx] += delta;
    }
  }
  void range_update (int lo, int hi, int delta) {
    update (lo, + delta);
    update (hi + 1, - delta);
  }
  int query (int idx) {
    int res = 0;
    for (; idx > 0; idx -= idx & (- idx)) {
      res += bit[idx];
    }
    return res;
  }
};

long long count_swaps(vector<int> s) {
  long long res = 0;
  const int n = (int) s.size();
  const int OFF = N + 5;
  vector<int> g [N + 5000]; 
  for (int i = 0; i < n; i++) {
    g[s[i] + OFF].emplace_back(i);
  }
  FenwickTree fen (N + 5000); 
  for (int i = 0; i < n; i++) {
    if (is_valid[i] == true) continue; 
    int target = s[i] * -1;
    int primeiro = i + fen.query (i + 1);
    int p = *lower_bound(g[target + OFF].begin(), g[target + OFF].end(), i);
    int segundo = p + fen.query (p + 1);
    is_valid[p] = true;
 //   assert (primeiro < segundo);
    res += segundo - primeiro;
    if (s[i] < 0) --res;
    fen.range_update (p + 1, N, - 1);  
  }
	return res;
}
#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...