#C00003D. puzzle game

puzzle game

题目背景

Han24666正在玩密室逃脱游戏

题目描述

密室里有一个长度为 n 的未知排列 a1,a2,...,ana_1, a_2, ..., a_n(排列定义:1ain1 ≤ a_i ≤ n,所有元素互不重复)。Han24666可以向交互面板发起两种类型的询问(见下方),每种询问有明确的格式和返回规则,但需要知道原序列是什么才能打开大门,Han24666请求你帮助

询问类型说明

  1. 区间奇偶统计询问 格式:? count l r t 参数说明:

    • 1lrn1 ≤ l ≤ r ≤ n:表示询问的区间范围(左端点~右端点)
    • t{0,1}t ∈ \{0,1\}:t=0 表示统计偶数数量,t=1 表示统计奇数数量 返回值:整数,表示区间 [l,r][l,r] 内符合 t 类型的数字个数 次数限制:最多 2n2n
  2. 位置比较询问 格式:? cmp x y 参数说明:

    • 1x,yn1 ≤ x,y ≤ nxyx ≠ y:表示要比较的两个位置 返回值:字符,> 表示 ax>aya_x > a_y< 表示 ax<aya_x < a_y= 表示 ax=aya_x = a_y(实际不会出现) 次数限制:最多 nlognn \log n

答案规则

格式:! a[1] a[2] ... a[n] 要求:

  1. 输出完整的秘密序列,元素间用单个空格分隔;
  2. 输出后程序必须立即终止,否则密室面板会判定解谜失败;
  3. 答案必须是合法的 1~n 排列,否则直接判定错误。

交互格式

完整交互流程

  1. 程序启动后,首先从标准输入读取整数 n(序列长度,1 ≤ n ≤ 5000);
  2. 程序输出询问行 → 强制刷新输出缓冲区 → 读取交互面板返回值;
  3. 重复步骤 2,直到确定完整序列(总询问次数需满足两种类型的次数限制);
  4. 程序输出答案行 → 强制刷新输出缓冲区 → 终止程序。

交互示例(n=4,秘密序列为 [3,1,4,2])

程序读取:4

程序输出:? count 1 4 1

交互面板返回:2

程序输出:? cmp 1 2

交互面板返回:>

程序输出:? cmp 3 4

交互面板返回:>

程序输出:! 3 1 4 2

数据限制

1 ≤ n ≤ 5000

区间奇偶统计询问次数 ≤ 2n

位置比较询问次数 ≤ n log n

总询问次数无额外限制(满足上述两类限制即可)

时间限制:2000ms

空间限制:512MB

禁止行为 & 格式要求

禁止操作(触发解谜失败)

  1. 区间奇偶统计询问中,l > r 或 t 不为 0/1;
  2. 位置比较询问中,x = y 或 x/y 超出 1~n 范围;
  3. 超出任意一种询问的次数限制;
  4. 询问格式错误(如缺少参数、多余空格、类型拼写错误);
  5. 输出答案后未立即终止程序。

输出缓冲区刷新要求

交互过程中,所有输出(询问行、答案行)后必须强制刷新缓冲区,否则面板无法实时接收信息,判定超时(TLE)。不同编程语言的刷新方式:

  • C++:fflush(stdout) / cout.flush()(需包含 头文件);