답안 #220097

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
220097 2020-04-07T01:12:50 Z rama_pang Minerals (JOI19_minerals) C++14
0 / 100
7 ms 768 KB
#include "minerals.h"
#include <bits/stdc++.h>
using namespace std;

int optimal_pivot(int n) {
  static int MAXN = 43005;
  static vector<pair<int, int>> optimal(MAXN, make_pair(1e8, 1e8));
  static bool computed = false;

  if (computed) return optimal[n].second;

  computed = true;
  optimal[0] = optimal[1] = {0, 0};
  for (int i = 2; i < MAXN; i++) {
    int lo = 1, hi = i / 2;
    while (lo < hi) {
      int m1 = (lo + hi) / 2;
      int m2 = m1 + 1;
      int c1 = optimal[m1].first + optimal[i - m1].first + i - 1 + m1;
      int c2 = optimal[m2].first + optimal[i - m2].first + i - 1 + m2;
      if (c1 < c2) {
        hi = m1;
      } else {
        lo = m2;
      }
    }
    optimal[i] = make_pair(optimal[lo].first + optimal[i - lo].first + lo + i - 1, lo);
  }

  return optimal_pivot(n);
}

bool query(int x) {
  static int last = -1;
  int cur = Query(x);
  bool res = (cur == last);
  last = cur;
  return res;
}

void Solve(vector<int> A, vector<int> B, bool isBInside) {
  int n = A.size();
  if (n == 0) return;
  if (n == 1) return Answer(A[0], B[0]);

  int piv = optimal_pivot(n);
  vector<int> Aleft, Aright;
  vector<int> Bleft, Bright;
  if (isBInside) { // All of B is in the box, so we remove the second half
    for (int i = 0; i < n - piv; i++) {
      Bleft.emplace_back(B[i]);
    }
    for (int i = n - piv; i < n; i++) {
      Bright.emplace_back(B[i]);
      query(B[i]); // 
    }
  } else { // None of B is in the box, so we add the first half
    for (int i = 0; i < piv; i++) {
      Bleft.emplace_back(B[i]);
      query(B[i]); // add elemens in B such that only the first half remains
    }
    for (int i = piv; i < n; i++) {
      Bright.emplace_back(B[i]);
    }
  }

  for (int i = 0; i < n; i++) {
    if (Aright.size() == n - piv) {  
      Aleft.emplace_back(A[i]);   // all A[i] in the right half is matched
    } else if (Aleft.size() == piv) { 
      Aright.emplace_back(A[i]);  // all A[i] in the left half is matched
    } else if (query(A[i])) {
      Aleft.emplace_back(A[i]);   // A[i] has a match is in the first half of B
    } else {
      Aright.emplace_back(A[i]);  // A[i] has a match in the second half of B
    }
  }

  return Solve(Aleft, Bleft, true), Solve(Aright, Bright, false);
}

void Solve(int N) {
  vector<int> A, B;
  for (int i = 1; i <= 2 * N; i++) {
    if (query(i)) { // the current element is already in the box
      B.emplace_back(i);
    } else { // the current element is a new element
      A.emplace_back(i);
    }
  }

  return Solve(A, B, true);
}

Compilation message

minerals.cpp: In function 'void Solve(std::vector<int>, std::vector<int>, bool)':
minerals.cpp:68:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if (Aright.size() == n - piv) {  
         ~~~~~~~~~~~~~~^~~~~~~~~~
minerals.cpp:70:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     } else if (Aleft.size() == piv) { 
                ~~~~~~~~~~~~~^~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 768 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 768 KB Wrong Answer [5]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 768 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 768 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 768 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 768 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 768 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 768 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 768 KB Wrong Answer [3]
2 Halted 0 ms 0 KB -