Submission #339035

#TimeUsernameProblemLanguageResultExecution timeMemory
339035markussieArranging Shoes (IOI19_shoes)C++17
100 / 100
166 ms23020 KiB
#include "shoes.h"
#include <vector>
#include <algorithm>

#pragma GCC optimize("O2")

using namespace std;

vector<int> t;

void update(int v, int tl, int tr, int pos)
{
  if(tl == tr)
    ++t[v];
  else
    {
      int mid = (tl + tr)/2;
      if(pos <= mid)
	update(v*2, tl, mid, pos);
      else
	update(v*2+1, mid+1, tr, pos);
      t[v] = t[v*2] + t[v*2+1];
    }
}

int query(int v, int tl, int tr, int l, int r)
{
  if(l > r)
    return 0;
  if(tl == l && tr == r)
    return t[v];
  int mid = (tl + tr) / 2;
  return query(v*2, tl, mid, l, min(mid, r)) +
    query(v*2+1, mid+1, tr, max(mid+1, l), r);
}

long long count_swaps(std::vector<int> s)
{
  int n = s.size();
  t.resize(4*n);
  vector<vector<int>> l(n), r(n);

  for(int i = 0; i < n; ++i)
    if(s[i] < 0)
      l[-s[i]-1].push_back(i);
    else
      r[s[i]-1].push_back(i);

  long long ans = 0;
  vector<char> used(n);
  vector<int> cnt(n);
  for(int i = 0; i < n; ++i)
    {
      if(used[i])
	continue;
      if(s[i] < 0)
	{
	  ans += r[-s[i]-1][cnt[-s[i]-1]] - i - query(1, 0, n-1, i, r[-s[i]-1][cnt[-s[i]-1]]) - 1;
	  used[r[-s[i]-1][cnt[-s[i]-1]]] = 1;
	  update(1, 0, n-1, r[-s[i]-1][cnt[-s[i]-1]]);
	}
      else
	{
	  ans += l[s[i]-1][cnt[s[i]-1]] - i - query(1, 0, n-1, i, l[s[i]-1][cnt[s[i]-1]]);
	  used[l[s[i]-1][cnt[s[i]-1]]] = 1;
	  update(1, 0, n-1, l[s[i]-1][cnt[s[i]-1]]);
	}
      ++cnt[abs(s[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...