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\),只有 \(\le 1\) 个 \(0\)
考虑使用线段树维护答案:
- 对于上面的情况 \(1\),我们可以发现对于每个 \(1\),它的贡献就是 \((下一个 1的位置 - 这个 1 的位置) \times (这个 1 的位置 - 上一个 1 的位置)\),也就是左端点的选择方案 \(\times\) 右端点的方案。然后在线段树上面维护左 / 右连续的 \(0\) 的个数,以及 左 / 右 的 \(1\) 的 右 / 左 端点的选择方案,合并的时候讨论增量即可。
- 对于情况 \(2\),我们可以维护 \(L(i,j), R(i,j), 0 \le i, j \le 1\) 表示前缀 / 后缀中 \(1\) 的个数 \(\bmod ~ 2 = i\) 且有 \(j\) 个 \(0\) 的个数,合并的时候简单讨论即可,然后可以轻松计算贡献了。
- 但是还有算重的情况,对于只有 \(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」染色不太会证明,自闭了,不更。