Submission #1308436

#TimeUsernameProblemLanguageResultExecution timeMemory
1308436KickingKunMinerals (JOI19_minerals)C++20
40 / 100
26 ms4088 KiB
#include "minerals.h"
#include <bits/stdc++.h>
using namespace std;

mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
int random(int l, int r) {
  return uniform_int_distribution <int> (l, r)(rng);
}

#define pii pair <int, int>
#define fi first
#define se second

const int MAXN = 50000;
vector <int> events[MAXN];

void Solve(int N) {
  vector <int> L, R;
  for (int i = 1; i <= 2 * N; i++) {
    if (Query(i) == L.size() + 1) L.emplace_back(i);
    else {
      Query(i);
      R.emplace_back(i);
    }
  }
  for (int &x: L) Query(x);

  vector <pii> range(N, make_pair(0, N - 1));
  vector <bool> remove(N);

  while (true) {
    for (int i = 0; i < N; i++) {
      if (range[i].fi == range[i].se) {
        remove[range[i].fi] = true;
      }
    }

    vector <int> remain;
    for (int i = 0; i < N; i++)
      if (!remove[i]) remain.emplace_back(i);
    if (remain.empty()) break;

    // cerr << remain.size() << endl;

    for (int i = 0; i < remain.size(); i++)
      events[i].clear();

    int maId = -1;
    for (int i = 0; i < N; i++) if (range[i].fi != range[i].se) {
      int l = lower_bound(remain.begin(), remain.end(), range[i].fi) - remain.begin();
      int r = upper_bound(remain.begin(), remain.end(), range[i].se) - remain.begin() - 1;
      if (range[i].fi == range[i].se) range[i].fi = range[i].se = remain[l];
      else {
        range[i] = make_pair(remain[l], remain[r]);
        int mid = (l + r) >> 1;
        events[mid].emplace_back(i);
        maId = max(maId, mid);
      }
    }
    if (maId == -1) break;

    for (int i = 0; i <= maId; i++) {
      Query(R[remain[i]]);
      for (int &l: events[i]) {
        int tmp = Query(L[l]); Query(L[l]);
        if (tmp == i + 1) range[l].se = remain[i];
        else range[l].fi = remain[i + 1];
      }
    }
    for (int i = 0; i <= maId; i++) Query(R[remain[i]]);
  }

  for (int i = 0; i < N; i++)
    Answer(L[i], R[range[i].fi]);
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...