HNOI
\(\text{I}\). [HNOI/AHOI2018] 寻宝游戏
先考虑 \(m=1\) 的情况。
注意到位运算具有短路性。具体来说,有
所以若有 \(\&0\) 或 \(\mid1\),那么前面的操作都不用做了。
进一步观察可以发现
也就是说,其他操作并不会改变答案。
接下来就是这题最人类智慧的地方了,考虑把 \(\&\) 看作 \(1\),\(\mid\) 看作 \(0\),那么答案为 \(1\) 当且仅当操作序列小于原序列。(注意是把后面的看作高位)
Proof:
记操作序列为 \(a\),原序列为 \(b\)。
-
先证必要性,假设对于第 \(i\) 位是第一个满足 \(a(i)<b(i)\) 的,因为 \(\forall j>i,a(j)=b(j)\),所以最后的答案等于前 \(i\) 个的答案。又因为 \(a(i)<b(i)\),所以这一位会被短路成 \(1\)。
-
再证充分性,考虑证明它的逆否命题:操作序列大于等于原序列可以推出答案为 \(0\)。当大于时证明与上述类似,而等于时显然是最开始的 \(0\)。\(\square\)
再考虑 \(m>1\) 的情况。
先将每一位的序列排序。每次查询一个数 \(s\),对于 \(s_i=0\) 的位,要满足操作序列大于等于原序列;否则要小于。这样就可以求出一个操作序列的范围,直接输出即可。
\(\text{II}\). [AH2017/HNOI2017] 礼物
考虑每个点作为 \(\max\) 的贡献,记 \(lb_i,rb_i\) 分别为其左/右第一个大于它的数的位置,那么有
-
\((lb_i,rb_i)\) 这一对是个一类点对,并且也只有这一对是。因为区间缩小不满足条件,扩大 \(i\) 就不是 \(\max\) 了。
-
\((lb_i,k)(i<k<rb_i)\) 都是一个二类点对,同理 \((k,rb_i)(lb_i<k<i)\) 也是。这些区间同样不能再扩大和缩小了。
所以一个点作为 \(\max\) 的贡献为
-
若 \(L\le lb_i\le rb_i\le R\),则有 \(p_1\) 的贡献。
-
若 \(lb_i\ge L\),则有 \(p_2\times(\min(R,rb_i-1)-i)\) 的贡献。
-
若 \(rb_i\le R\),则有 \(p_2\times(i-\max(L,lb_i+1))\) 的贡献。
然后考虑如何用数据结构维护。
第一种贡献是二维数点,二三种是类似的,只考虑第二种。
考虑对于每个 \(lb_i\ge L\),给区间 \([i+1,rb_i-1]\) 作为点对的右侧的贡献加一。查询时查区间 \([L,R]\) 内所有作为点对的右侧的贡献之和,这可以用线段树/树状数组求出。
\(\text{III}\). [AH2017/HNOI2017] 礼物
先转化为旋转序列 \(a\),并可以给序列 \(a\) 加上任意整数 \(c\),要求最小化 \(\sum(a_i-b_i)^2\)。
暴力拆式子得到
惊奇地发现只有最后的 \(\sum a_ib_i\) 不是定值。
观察到这一形式,想到卷积。将序列 \(a\) 翻转后再复制一份,然后与序列 \(b\) 卷起来就可以得到所有可能的的 \(\sum a_ib_i\)。
前面关于 \(c\) 的二次函数可以暴力枚举 \(c\) 的取值。
\(\text{VI}\). [AHOI2017/HNOI2017] 大佬
把恢复自信值的操作与怼大佬的操作分开。
先用 DP 预处理出不被嘲讽死下的最多的不恢复自信的天数(即最多的不做水题的天数)。再用 BFS 暴搜+ Hash 判重求出所有可能的 \((f,t)\) 对,表示经过 \(t\) 天后嘲讽值为 \(f\)。
不怼和只怼一次大佬的情况很好判断,所以只需解决怼两次大佬。
不妨设两次分别为 \((f_i,t_i)\) 和 \((f_j,t_j)\),那么有
其中 \(D\) 表示上文求出的最多的不恢复自信的天数。
先把二元组按 \(f\) 排序。考虑从大到小枚举 \(i\),那么 \(j\) 的范围是一段前缀,且要 \(f_j-t_j\) 最大。每次双指针加入即可。
\(\text{V}\). [AH2017/HNOI2017] 抛硬币
先考虑 \(a=b\) 的情况。此时两人获胜的方案数是相同的,均为总方案数减去平局的方案数,再除以 \(2\)。
总方案数显然为 \(2^{a+b}\),平局的方案数为
再考虑 \(a>b\) 的情况。类似地,可以想到有很多状态都和上面一样,对偶后是对方胜的。
对偶的一对方案中,一定恰好有一组是 \(A\) 赢(包括平局)。所以若记 \(S\) 为不对偶的方案数,那么有
此时,根据定义有
所以可以枚举 \(\left|B\right|\) 和 \(\left|A\right|-\left|B\right|\),那么有
其中最后一步用到了范德蒙德卷积。
然后直接 exLucas 即可。时间复杂度 \(O((b-a)\log^2a+2^k+5^k)\)。
CQOI
[CQOI2018] 九连环
记 \(f_n\) 表示 \(n\) 个环全部拆卸的最小步数。那么肯定是先将第 \(n\) 个环拆下,之后步数是 \(f_{n-1}\),而前面是将前 \(n-2\) 个环拆卸后拆下第 \(n\) 个环,然后再装上前 \(n-2\) 个环,所以有
进一步观察可以发现,\(f_n=2f_{n-1}+(n\bmod 2)\),考虑用归纳法证明:
-
若 \(n=1\),显然有 \(f_1=2f_0+1\)。
-
若 \(n>1\),那么
-
若 \(n\bmod 2=1\),则 \(f_n=f_{n-1}+2f_{n-2}+1=2f_{n-1}+1\)。
-
若 \(n\bmod 2=0\),则 \(f_n=f_{n-1}+2f_{n-2}+1=2f_{n-1}\)。\(\square\)
-
但并没有那么简单。注意到 \(f_n\ge2^n\),所以至少有 \(B=n\lg2\approx30102\) 位,要写高精度。
考虑求出 \(F(x)=\sum f_ix^i\) 的封闭形式:
然后就可以求出通项公式了:
直接 NTT 算出 \(2^{n+2}\) 即可。