BJOI 2018 题目选做


LOJ2492「BJOI2018」二进制

pupil 发现对于一个十进制数,无论怎么将其的数字重新排列,均不影响其是不是 \(3\) 的倍数。他想研究对于二进制,是否也有类似的性质。
于是他生成了一个长为 \(n\) 的二进制串,希望你对于这个二进制串的一个子区间,能求出其有多少位置不同的连续子串,满足在重新排列后(可包含前导 \(0\))是一个 \(3\) 的倍数。两个位置不同的子区间指开始位置不同或结束位置不同。
由于他想尝试尽量多的情况,他有时会修改串中的一个位置,并且会进行多次询问。
\(1 \leq n,m \leq 100000\)\(l \leq r\)


  数据结构 线段树 结论

  其实想清楚了,就不是很难写了。

  经过手玩仔细推理可以发现对于一个串 \(s\),我们可以分几种情况判断其合法的条件:

  • \(2k(k \ge 1)\)\(1\):无论如何都是合法的。
  • \(1\)\(1\):肯定不合法。
  • \(2k+1(k \ge 1)\)\(1\):如果被整个串都是 \(1\),或者只有一个 \(0\),那么就是不合法的,其他都是合法的。

  然后我们发现,合法的是不太好统计的,于是正难则反,统计非法的。

  只要满足一点,那么一个串 \(s\) 非法的情况:

  1. 只有 \(1\)\(1\)
  2. 奇数个 \(1\),只有 \(\le 1\)\(0\)

  考虑使用线段树维护答案:

  1. 对于上面的情况 \(1\),我们可以发现对于每个 \(1\),它的贡献就是 \((下一个 1的位置 - 这个 1 的位置) \times (这个 1 的位置 - 上一个 1 的位置)\),也就是左端点的选择方案 \(\times\) 右端点的方案。然后在线段树上面维护左 / 右连续的 \(0\) 的个数,以及 左 / 右 的 \(1\) 的 右 / 左 端点的选择方案,合并的时候讨论增量即可。
  2. 对于情况 \(2\),我们可以维护 \(L(i,j), R(i,j), 0 \le i, j \le 1\) 表示前缀 / 后缀中 \(1\) 的个数 \(\bmod ~ 2 = i\) 且有 \(j\)\(0\) 的个数,合并的时候简单讨论即可,然后可以轻松计算贡献了。
  3. 但是还有算重的情况,对于只有 \(1\)\(1\),并且只有 \(1\)\(0\) 的情况,那么会多算,减去即可(注意只有 \(1\)\(1\),但是没有其他的情况可以通过赋初值解决)。

  这个是代码,喜提 LOJ 目前最快解。

LOJ2512「BJOI2018」链上二次求和

  见。

LOJ2511「BJOI2018」双人猜数游戏

Alice 和 Bob 是一对非常聪明的人,他们可以算出各种各样游戏的最优策略。现在有个综艺节目《最强大佬》请他们来玩一个游戏。主持人写了三个正整数 \(s\)\(m\)\(n\) ,然后一起告诉 Alice 和 Bob \(s \leq m \leq n\) 以及 \(s\) 是多少。(即,\(s\) 是接 下来要猜的 \(m\)\(n\) 的下限。)之后主持人单独告诉 Alice \(m\)\(n\) 的乘积是多少, 单独告诉 Bob \(m\)\(n\) 的和是多少。
当然,如果一个人同时知道 \(m\)\(n\) 的乘积以及 \(m\)\(n\) 的和话就能很容易地算出 \(m\)\(n\) 分别是多少,但现在 Alice 和 Bob 只分别知道其中一个,而且只分别知道其中一个,而且他们只能回答主持人的问题,不能交流。从 Alice 或 Bob(见输入)开始 依次询问 Alice/Bob 知不知道 \(m\)\(n\) 分别是多少, Alice/Bob 只能回答知道/不知道。
为了节目效果,为了显示出 Alice 和 Bob 非常聪明,主持人希望 Alice 和 Bob 一共说了 \(t\) 次“不知道 ”以后两个人都知道 \(m\)\(n\) 是多少了 。现在主持人找到你,希望让帮他构造一组符合条件的 \(m\)\(n\)
\(1 \leq s \leq 200\)\(2 \leq t \leq 15\),输入数据保证有解。


  提交答案 动态规划

  前年的题目,今年落实。。。

  当时是 ztl 和 M_sea 的 noip 模拟赛蒯的题,今天居然发现了原题!

  那个时候我刚刚来到 CJ,甚至不知道 ztl 的洛谷 id,只知道 M_sea。转眼间,就轮到我退役了,时间真快啊。

  我们可以设 \(f(turn, x, y)\) 表示,经过了 \(turn\) 轮之后,对于 \(m = x\)\(n = y\) 是否当前这个人可以确定答案。

  • \(turn = 1\) 时,如果 \(x, y\) 是唯一的一组,那么就是 \(1\),否则为 \(0\)

  • 对于 \(turn \neq 1\),如果

    • \(f(turn - 2, x, y)\)\(1\),也就是这个人上一次可以确定了,那么就是 \(1\)
    • 对于其他满足当前这个人条件的 \((a, b)\)(如对于 Alice,就是 \(ab = xy\)\(a \le b\) 的对),只有 \((x, y)\) 是不确定的,那么 \(f(turn, x,y)\)\(1\)

  然后将 DP 记忆化一下,然后暴力枚举答案进行判断即可。

  有关的生成器代码和答案:https://gitee.com/yinjinrun/code-public-2/tree/master/LOJ/2511。

  LOJ2493「BJOI2018」染色不太会证明,自闭了,不更。