#P16175. [Ncpc2023]Berry Battle 2浆果大战 2

[Ncpc2023]Berry Battle 2浆果大战 2

题目描述

Erik 经常和爷爷一起去森林里摘蓝莓。爷爷总是摘得最多,虽然这并不是一场正式比赛,但 Erik 已经受够了。

Erik 发现,爷爷摘蓝莓时会使用一种非常简单的贪心策略。于是 Erik 想利用这一点,终于做到摘到不少于爷爷数量的蓝莓。

蓝莓灌木可以表示为一个长度为 N=105N=10^5 的字符串

s=s1s2sN,s=s_1s_2\cdots s_N,

其中每个字符为 .b

  • si=bs_i=\texttt{b},表示位置 ii 有一颗蓝莓;
  • si=.s_i=\texttt{.},表示位置 ii 没有蓝莓。

初始时恰好有 N/2N/2 颗蓝莓,并且它们的位置是均匀随机生成的。

摘蓝莓按回合进行。每一步,一个人可以选择一个位置 ii,满足

1iN3,1\le i\le N-3,

然后摘走位置 i,i+1,i+2,i+3i,i+1,i+2,i+3 上的所有蓝莓。

爷爷先手,然后 Erik 行动,然后爷爷行动,如此交替进行。

爷爷每次都会贪心地选择一个能摘到最多蓝莓的位置。如果有多个位置都能摘到同样多的最多蓝莓,则爷爷会在这些位置中随机选择一个。

你会得到初始字符串 ss。你的任务是编写一个程序,在交互过程中决定 Erik 每一步的选择,使得最终 Erik 摘到的蓝莓数不少于爷爷。

交互格式

本题为交互题。

交互器首先向你的程序输入两行:

第一行包含一个整数 NN,表示字符串长度。除样例外,正式测试中始终有:

N=105.N=10^5.

第二行包含一个长度为 NN 的字符串 ss,其中恰好有 N/2N/2 个字符为 b

之后开始交互。

当轮到爷爷行动时,你的程序需要读取一个整数 ii,表示爷爷选择了区间

[i,i+3][i,i+3]

并摘走其中的所有蓝莓。

当轮到 Erik 行动时,你的程序需要输出一个整数 ii,表示 Erik 选择区间

[i,i+3][i,i+3]

并摘走其中的所有蓝莓。

每次输出后,必须刷新输出缓冲区。

例如:

  • C++ 可以使用 endlcout.flush()
  • C 可以使用 fflush(stdout)
  • Python 可以使用 print(..., flush=True)

如果轮到 Erik 行动时已经没有蓝莓了,你的程序应当直接结束,不再输出任何内容。

如果轮到爷爷行动时已经没有蓝莓了,交互器也不会再给出新的爷爷操作,此时你的程序也应结束。

最终如果 Erik 摘到的蓝莓数不少于爷爷,则该测试点通过。

爷爷的策略

每一轮爷爷都会选择当前能摘到蓝莓数最多的长度为 44 的连续区间。

若这样的区间有多个,爷爷会随机选择其中一个。

在本 Hydro 配置中,爷爷的随机选择由测试点输入中的隐藏随机种子控制。该种子不会传给选手程序,因此选手程序只能根据交互器实际给出的爷爷操作进行应对。

测试点说明

正式数据共有 100100 个测试点。

保证存在一种策略,能够以很高概率通过所有测试点。

样例交互

下面的样例中,< 表示交互器输出给选手程序的内容,> 表示选手程序输出给交互器的内容。

< 20
< .bbb.b.bb...b.b...bb
< 2
> 6
< 13
> 17

在这个样例中,Erik 和爷爷最终各摘到 55 颗蓝莓,因此 Erik 达成目标。

游戏开始时,单次最多可以摘到 33 颗蓝莓。能摘到 33 颗蓝莓的位置有 1,2,3,61,2,3,6,爷爷随机选择了 i=2i=2。随后 Erik 选择 i=6i=6,也摘到 33 颗蓝莓。最后两轮中,爷爷和 Erik 各摘到 22 颗蓝莓。