7.24 模拟赛
总结
挂分 > 得分的一天。守 序 中 立 20 + 20 + 20 + 20 = 80
t1 分类讨论出了问题。100 -> 20
t2 的 60 分暴力不知道哪挂了,重新写一遍交上去是对的,特殊性质分没挂。60 -> 20
t3 卡在了统计答案上,主要是异或的情况不会处理。
t4 暴力还可以。
题解
sequence
注意到当 \(i\) 为奇数时,\(a_i+a_{i+1}=n+1\),\(i\) 为偶数时 \(a_i+a_{i+1}=n+2\),那么对 \(l,r\) 分类讨论
- 若 \(l\) 为奇数,\(r\) 为奇数,那么有 \(\sum_{i=1}^ra_i=(n+1)\frac {r-l}2+a_r\),根据 \(s\) 模 \(n+1\) 的余数可以确定 \(a_r\),从而确定 \(r\)。
- 若 \(l\) 为偶数,\(r\) 为偶数,那么有 \(\sum_{i=1}^ra_i=(n+2)\frac {r-l}2+a_r\),根据 \(s\) 模 \(n+2\) 的余数可以确定 \(a_r\),从而确定 \(r\)。
- 若 \(l\) 为奇数,\(r\) 为偶数,那么有 \(\sum_{i=1}^ra_i=(n+1)\frac {r-l+1}2\),根据 \(s\) 模 \(n+1\) 的余数可以确定 \(a_r\),从而确定 \(r\)。
- 若 \(l\) 为偶数,\(r\) 为奇数,那么有 \(\sum_{i=1}^ra_i=(n+1)\frac {r-l+1}2\),根据 \(s\) 模 \(n+2\) 的余数可以确定 \(a_r\),从而确定 \(r\)。
时间复杂度为 \(\mathcal O(q)\)。
function
特殊性质分:暴力打完后打表,发现答案为数列:\(1,2,4,7,13,25,49,\cdots\)
注意到从第 \(4\) 项开始有 \(a_n=2a_n-1\),直接递推即可。
正解:考虑暴力判断的条件:\(y\) 合法当且仅当 \(y\) 的第 \(b+1\) 位为 \(0\) 或 \(b-1\) 位为 \(1\)。
用 \([0,R]\) 的答案减去 \([0,l)\) 的答案。对于区间 \([0,R]\),用类似数位 DP 的方法将其划分为 \(\mathcal O(\log n)\) 个区间,使得每个区间的数形如第 \(k\) 位固定,低位 0/1 任取。枚举 \(b\),规定好 \(y\) 的 \(b-1\) 和 \(b+1\) 位后,剩下的填法是一个组合数问题。
时间复杂度为 \(\mathcal O(T\log^2R)\)。
game
考虑 Alice 和 Bob 已经买完了商品 \(\{c\}\) 和 \(\{d\}\),那么题目就变成了 Nim 游戏。
注意到 \(\bigoplus d\leq\sum d\leq m\),所以 Bob 能赢当且仅当 \(\bigoplus c\leq m\)。
那么现在问题变为,统计 \(c_1,c_2,\cdots,c_n\geq0\) 的数量,满足 \(\sum c_ia_i\leq k\) 且 \(\bigoplus c>m\)。
考虑按位 DP。假设已经确定了 \(c_1,c_2,\cdots,c_n\) 的低 \(b\) 位,只需记录 \(\sum c_ia_i\) 低 \(b\) 位和 \(k\) 低 \(b\) 位的大小关系,当前 \(\sum c_ia_i\) 往 \(b\) 位以后的进位,和 \(\bigoplus c\) 低 \(b\) 位和 \(m\) 低 \(b\) 位的大小关系。第二维的大小只有 \(\mathcal O(\sum a_i)\) 级别。
对于 \(b+1\) 位依次 DP 每个 \(c_i\) 在这位的取值并转移。
时间复杂度为 \(\mathcal O\left(n\sum a_i\max(\log k,\log m)\right)\)。
card
预处理去掉每个数的平方因子,则此时每个数的质因子数量小于等于 \(\omega=7\)。记 \(t_i\) 表示 \(i\) 的质因子个数,则两个数 \(x,y\) 要操作 \(t_x+t_y-2t_{\gcd(x,y)}\) 次才能满足 \(x\times y\) 是完全平方数。
考虑 \(a\mid b\),则 \(t_a\leq t_b\),要最小化 \(t_x+t_y-2t_{\gcd(x,y)}\),则如果只处理一次询问,可以枚举 \(d\mid x,d\mid y\) 统计 \(t_x+t_y-2t_{d}\) 的最小值。也就是要找到最小的和次小的 \(t\)。
对于一次询问,暴力地统计其中的最小值和次小值。对于多次询问,考虑真正有贡献的点对实际只有 \(\mathcal O(len)\) 对。具体地,枚举次小值所在的位置,找到其左,右第一个比自己小的作为最小值,则每个区间的情况都被包含了。正确性考虑截取其中的一个区间 \([l,r]\),找到区间最小值,则区间里的次小值会找到它作为某一边第一个比自己小的数计入答案。则问题转为区间包含的线段的最小权值,容易离线扫描线。
线段有 \(2^8\times n\leq 5\times 10^7\) 个,询问只有 \(10^6\) 个,扫描线时需要支持的操作是单点修改,后缀求 \(\min\)。
注意到答案不超过 \(14\),那么可以改为前缀取 \(\min\) 和单点查询。
前缀取 \(\min\) 是单调不降的,暴力往前更新 \(f\) 的值直到不能更新,则更新次数容易均摊到 \(2^\omega n\leq 14\times n\),可加速统计答案。
总时间复杂度是 \(\mathcal O(\omega2^\omega n+q+V\times \omega)\)。