Submission #540725

#TimeUsernameProblemLanguageResultExecution timeMemory
540725MilosMilutinovicComparing Plants (IOI20_plants)C++14
0 / 100
66 ms4816 KiB
#include "plants.h"
#include <bits/stdc++.h>

using namespace std;

vector<int> L;
vector<int> R;

void init(int k, vector<int> r) {
  int n = r.size();
  L.resize(n);
  R.resize(n);
  int high = n;
  while (*min_element(r.begin(), r.end()) != 1e9) {
    vector<int> order(n);
    iota(order.begin(), order.end(), 0);
    auto Cnt = [&](int i) {  
      int ret = 0, val = r[i];
      for (int j = 0; j + 1 < k; j++) {
        i -= 1;
        if (i < 0) {
          i += n;
        }
        ret += (r[i] == val);
      }
      return ret;
    };
    sort(order.begin(), order.end(), [&](int i, int j) {
      if (r[i] != r[j]) {
        return r[i] < r[j];
      }
      return Cnt(i) > Cnt(j);
    });
    //assert(Cnt(order[0]) == 0);    
    int ptr = 0;
    while (ptr + 1 < n && r[order[ptr + 1]] == r[order[ptr]] && Cnt(order[ptr + 1]) == Cnt(order[ptr])) {
      ptr += 1;
    }            
    for (int i = 0; i <= ptr; i++) {
      L[order[i]] = high - ptr;
      R[order[i]] = high;
      r[order[i]] = 1e9;
    }
    high -= (ptr + 1);
  }
  /*for (int i = 0; i < n; i++) {
    cout << L[i] << " " << R[i] << '\n';
  }*/
}

int compare_plants(int x, int y) {
  if (L[x] > R[y]) {
    return 1;
  }
  if (R[x] < L[y]) {
    return -1;
  }
  return 0;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...