logo AlgoBeat OnlineJudge
登录 注册

#216377. [ECUSTPC 2026 Spring] 左灯右行

内存限制:1024 MiB 时间限制:1000 ms 标准输入输出
题目类型:VJudge(洛谷) 评测方式:VJudge
上传者: 匿名

题目描述

:::epigraph 我爱你有种 :::


本题和试题 E 右灯左行共用相同的背景,两道题之间有较大的关系,建议在尝试其中一题前首先阅读另一题的文本。

这是一道交互题。

小 T 面对 T 城的地铁图犯了难……

具体而言,这座城市在 E 河两岸,北岸有 个地铁站点 ,南岸有 个地铁站点

T 城总共有 条地铁线路,每条线路都是环线,其中第 条环线连接的地铁站是 ,但这些地铁环线都是单向运行的,可能是 也可能是

每条环线都有一个价目表 ,分别表示这 4 个相邻站(, , )之间坐一站地铁移动的价格,注意坐一站地铁的方向由地铁的运行方向而定,可能是 也可能是

遗憾的是,时空黑洞吞噬了价目表上这些环线的运行方向和价格,小 T 准备求助大 K 的帮助来得知这些地铁的运行方向。

大 K 知道地铁的运行方向,不过,小 T 可以为每条环线的四段相邻站边重新任意指定一组价格;大 K 知道真实的运行方向,并会根据这些指定价格回答小 T 的询问。

小 T 可以询问他至多 个问题:

  • 地铁站 (可以是 也可以是 ,下略)到地铁站 坐地铁,在小 T 指定的地铁价目表下,至少需要支付多少地铁费用?
  • 若不同环线连接同一对相邻站,则这些边同时存在并且都可以使用。一次旅行的费用为所经过边权之和,站点间换乘不额外收费。

在询问完这些问题后,小 T 需要和大 K 确认每条地铁的运行方向。

请帮助小 T 解决这个问题。

请注意,地铁线路的方向是预先确定的,它们不会在交互的过程中更改,换言之交互器 不是 自适应的。

交互协议

本题每个测试点只有一组测试数据。

第一行输入一个整数 ,表示参数,其中地铁站共 座,环线共 条。

你首先需要输出 行,其中第 行输出 4 个整数 ,分别表示第 条环线上 , , 这四个相邻站之间的移动价格,你需要保证这四个整数在 之间。

随后你将会直接开始交互,每一次交互你可以以下面的格式向交互器询问问题:

  • 输出一行,首先输出一个字符 ? 表示你询问一次,随后输出 4 个元素 ,其中你需要保证 , ,表示小 T 需要询问大 K 位于 岸的第 个地铁站 到位于 岸的第 个地铁站 之间至少需要支付多少地铁费用。
  • 若你的输入合法并且没有超出询问限制,交互器会给出一行一个整数 供输入表示这两个站点之间最少需要的地铁费用。
  • 若你询问的问题超出了对应的询问次数限制,交互器会输出一个整数 并结束你的交互进程,此时你会获得答案错误的评测结果。

若你已经得到地铁方向的话,请按照以下的格式输出答案:

  • 输出一行,首先输出一个字符 !,随后输出一个长度为 的字符串 ,其中第 个字符 ,若 则表示第 条环线的方向为 ,若 则表示第 条环线的方向为

在完成输出答案后,你应当安全退出。

每次输出都需要输出换行并且刷新缓冲区,否则你可能会得到意料之外的结果。

为了刷新缓冲区,你可以:

  • 对于 C 或者 C++,使用 fflush(stdout)cout.flush()
  • 对于 Java 或 Kotlin,使用 System.out.flush()
  • 对于 Python,使用 stdout.flush()

样例

样例输入 1

3
10
12

样例输出 1

10 3 1 2
10 10 1 1
? N 1 N 2
? N 2 N 3
! OI

数据范围与提示

样例 1 解释

:::align{center} :::

上面的图展示了地铁的运行方向和小 T 的价格标注。

请注意样例中的交互过程仅供参考,实际交互过程并不唯一,且这一示例的交互过程不一定是可行的或是最优的,本题的样例不会在附加文件中出现。