社区讨论

关于 CF2129 C3/CF2130 E3 的疑问

学术版参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mds9i1yb
此快照首次捕获于
2025/08/01 11:26
7 个月前
此快照最后确认于
2025/08/01 16:48
7 个月前
查看原帖
注:下文“(没)有合法括号序列”指“这个字符串(没)有(连续的)子串属于合法括号序列。”
我赛时想到的做法是先用不超过 1919 次询问找到一个左括号的位置(先看看整个序列是不是没有合法括号序列,如果没有,则最后一个位置一定是 (,否则,像线段树一样每次当前区间从中间分开形成两个区间,如果两个区间都没有合法括号序列,则左边子区间右端点是 (,否则将当前区间变为两个子区间中任意一个有合法括号序列的区间,直到当前区间长度为 22,此时当前区间左端点是 ();
然后用一个类似二进制编码的思想,每 88 个一组,每个位置若干个 (( 加上当前位置的字符的组合(((((())拼接,根据结果的二进制位确定每个位置是 ( 还是 ),赛时没做出来,第二天做出来了;
然后想到了可以每组 1313 个,每次每个位置是若干个 (),然后用 ( 分割,因为 xx() 拼接会产生 x(x+1)2\frac{x(x+1)}{2} 个合法括号序列,只要保证每个位置产生的合法括号序列数量大于这组前面所有位置产生的合法括号序列数量,就能区分答案是由哪几部分贡献得到,也就能确认每个位置是 ( 还是 )
这个做法最坏情况下要用 9696 次询问,然而在评测记录中,我看到题解貌似用 8888 次询问就得到了这个字符串,请问题解是怎么做到这样的?

回复

2 条回复,欢迎继续交流。

正在加载回复...