제출 #443261

#제출 시각아이디문제언어결과실행 시간메모리
443261mkisicArranging Shoes (IOI19_shoes)C++14
100 / 100
180 ms17696 KiB
#include "shoes.h"
#include <cassert>
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

#define TRACE(x) cerr << #x << ' ' << x << endl
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, n) FOR(i, 0, n)
#define _ <<  " " << 

#define pb push_back

const int MAXN = 200100;

struct Fenwick {
  int p[MAXN];
  
  void clear() {
    memset(p, 0, sizeof p);
  }

  void add(int x) {
    for (int i = x; i > 0; i -= i &- i) 
      p[i]++;
  }

  int get(int x) {
    int ret = 0;
    for (int i = x; i < MAXN; i += i &- i)
      ret += p[i];
    return ret;
  }
}loga;

long long get_inv(vector <int> pos) {
  long long inv = 0;
  loga.clear();

  REP(i, pos.size()) {
    inv += loga.get(pos[i] + 1);
    loga.add(pos[i] + 1);
  }
  return inv;
}


long long solve(vector <int> p, int start, int T) {
  vector <int> pos;
  vector <int> v[MAXN];
  int n = p.size();
  pos.resize(n);
  int t = start;
  REP(i, n) {
    if (p[i]/abs(p[i]) == T) {
      v[max(p[i], -p[i])].pb(t);
      pos[i] = t;
      t += 2;
    }
  }
  
  REP(i, MAXN) reverse(v[i].begin(), v[i].end());

  REP(i, n) {
    if (p[i]/abs(p[i]) != T) {
      int x = v[max(p[i], -p[i])].back();
      v[max(p[i], -p[i])].pop_back();
      if (p[i] < 0) x--;
      else x++;
      pos[i] = x;
    }
  }

  return get_inv(pos);
}

long long f(vector <int> p) {
  int n = p.size() / 2;
  vector <int> r;
  vector <int> v[MAXN];
  REP(i, 2 * n) {
    int a = p[i] + n;
    int b = p[i];
    if (p[i] < 0) {
      a = abs(p[i]);
      b = a + n;
    }
    if (v[b].empty()) {
      v[a].pb(i);
      r.pb(abs(p[i]));
    } else v[b].pop_back(); 
  }

  REP(i, MAXN) assert(v[i].empty());

  REP(i, 2 * n) {
    int x = p[i] + n;
    if (p[i] < 0) x = abs(p[i]);
    v[x].pb(i);
  }

  REP(i, MAXN) reverse(v[i].begin(), v[i].end());
  
  vector <int> pos;
  pos.resize(p.size());

  int t = 0;
  REP(i, n) {
    pos[v[r[i]].back()] = t++;
    v[r[i]].pop_back();
    pos[v[r[i] + n].back()] = t++;
    v[r[i] + n].pop_back();
  }

  return get_inv(pos);
}


long long count_swaps(std::vector<int> s) {
  return min(min(solve(s, 0, -1), solve(s, 1, 1)), f(s));
}

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

shoes.cpp: In function 'long long int get_inv(std::vector<int>)':
shoes.cpp:10:42: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   10 | #define FOR(i, a, b) for (int i = (a); i < (b); i++)
      |                                          ^
shoes.cpp:11:19: note: in expansion of macro 'FOR'
   11 | #define REP(i, n) FOR(i, 0, n)
      |                   ^~~
shoes.cpp:42:3: note: in expansion of macro 'REP'
   42 |   REP(i, pos.size()) {
      |   ^~~
#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...