交互题制作求助

学术版

wly09 @ 2024-08-10 14:17:36

#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <numeric>
#include <random>

extern "C" bool Q(const int i, const int j, const int k);
extern "C" bool C(const int i, const int j);
extern "C" int solve(int n);

static int code = -1, *p;

bool Q(const int i, const int j, const int k) { return (p[i] - p[j]) % k == 0; }
bool C(const int i, const int j) {
  static int cnt = 0;
  if (cnt)
    std::cout << "Call C once more" << std::endl;
  return p[i] < p[j];
}

int main() {
  auto p = [] { std::cout << code << std::endl; };
  auto q = [] { std::cout << "at_quick_exit" << std::endl; };
  atexit(p);
  at_quick_exit(q);
  int n;
  std::cin >> n;
  ::p = new int[n];
  --::p;
  std::iota(::p + 1, ::p + n + 1, 1);
  std::random_device real_rnd;
  std::mt19937 rnd(real_rnd());
  std::shuffle(::p + 1, ::p + n + 1, rnd);
  code = ::p[solve(n)];
  delete[] (++::p);
  return 0;
}

这是我为某个交互题编写的交互库,在测试时使用 C++14 (GCC 9) 提交,但是全部 RE,提示信息是:

Runtime Error.

Received signal 11: Segmentation fault with invalid memory reference.

使用其他 C++ 可以 AC。

通过定义 solve 函数

int solve(int n) {
  exit(0);
}

确定了问题在调用 solve 函数之前。

有没有人能帮我解决一下?


by wly09 @ 2024-08-10 14:19:23

另外,使用在线 IDE 无法复现。


by sunkuangzheng @ 2024-08-10 14:24:00

洛谷交互题不能用 C++14 (GCC 9) 提交


by 035966_L3 @ 2024-08-10 14:25:46

@sunkuangzheng !?


by wly09 @ 2024-08-10 14:28:36

@sunkuangzheng 我制作其他交互题时没有遇到这种情况。。。


by lkwbian @ 2024-08-10 14:29:03

(别忘把Q的判0加上)


by wly09 @ 2024-08-10 14:30:37

@lkwbian RE 和 solve 无关;并且考虑到 p[0] 的值是未知的,所以我不打算判


by sunkuangzheng @ 2024-08-10 14:32:19

@wly09 额就是你用 C++14(GCC 9)不是一定会出问题,但是有时候就会出现 CE/RE/其他神秘情况。很多洛谷交互题题面里都会注明不要用 C++14(GCC 9)提交,比如 1 2 3


by wly09 @ 2024-08-10 14:33:56

@sunkuangzheng 也就是说这玩意会随机报错?

感谢。


|