제출 #1110425

#제출 시각아이디문제언어결과실행 시간메모리
1110425SonicMLArranging Shoes (IOI19_shoes)C++14
50 / 100
73 ms20696 KiB
#include <iostream>
#include "shoes.h"
#include <map>

using namespace std;

int const NMAX = 2e5;
int freq[1 + NMAX];
map <pair <int, int>, int> pos;
pair <int, int> arr[1 + NMAX];
bool vis[1 + NMAX];
int aib[1 + NMAX];

void update(int pos, int add, int n) {
  for(int i = pos;i <= n;i = 2 * i - (i&(i-1))) {
    aib[i] += add;
  }
}

int query(int pos) {
  int ans = 0;
  for(int i = pos;i > 0;i = (i&(i-1))) {
    ans += aib[i];
  } 
  return ans;
}

long long count_swaps(vector <int> s) {
  int n = s.size();
  for(int i = 0;i < n;i++) {
    freq[s[i]+n]++;
    arr[i] = {s[i], freq[s[i]+n]};
    pos[arr[i]] = i;
    update(i+1, 1, n);
  }
  long long ans = 0;
  for(int i = 0;i < n;i++) {
    if(!vis[i]) {
      pair <int, int> partner = {-arr[i].first, arr[i].second};
      int to = max(pos[partner], i), from = min(pos[partner], i);
      int dist = query(to+1) - query(from+1);  
      if(s[i] < 0) {
	dist--;
      }
      ans += dist;
      vis[i] = vis[pos[partner]] = true;
      update(i+1, -1, n);
      update(pos[partner]+1, -1, n);
    }
  }
  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...