【考后总结】4月清北营模拟赛 1
4.18 冲刺清北营 2
T1 操作
设 \(q_i=1-p_i\)
把结果式子拆开,发现对于一个选择加法的位置 \(i\),\(a_i\) 的系数是后面所有选择乘法位置的 \(b\) 的乘积。因此我们可以把贡献提出,考虑每个位置 \(i\) 以及后面的贡献在累加。
如果只考虑选择乘法的位置,可以写出一个生成函数的形式 \(\prod_i [(1-p_i)b_ix+p_i]\),这样 \([x^k]\) 表示有 \(k\) 个数产生贡献的系数与概率的乘积。但由于 \(i\) 后面的后缀 \([i+1,n]\) 中可以存在选择加法的,这样需要在统计答案时单独处理方案数,很不好做。
尝试把定义由有 \(k\) 个数产生系数贡献修改成后面是长度为 \(k\) 的后缀,这样被计入后缀的贡献是 \(q_ib_i+p_i\),而没有被计入的贡献是 \(1\),按照上面写成生成函数就是 \(\prod_i [(q_ib_i+p_i)x+1]\)。
求积可以分治优化,复杂度是 \(O(n\log^2 n)\)。
最后统计答案时枚举每个元素 \(i\) 以及其放置的位置 \(k\),需要容斥,因为我们并没有考虑后缀 \([k+1,n]\) 与枚举的位置 \(k\) 上放了重复元素的情况,后缀 \([k,n]\) 的情况只需要在 \([k+1,n]\) 的容斥后答案的基础上单步容斥。同时还要卷积得到的是无序集合,要乘上方案数 \(k(n-1-k)!\),最后总答案除以 \(n!\) 即为期望,复杂度是 \(O(n^2)\)。
考虑降低这个统计答案的过程,最后要求的多项式就是:
这可以分治去做,需要维护:
转移是:
最终复杂度 \(O(n\log^2 n)\)。
T2 选数
答案是对 \(\gcd\) 求和,套路性地去想到枚举 \(\gcd\) 为 \(i\) 的倍数的情况,从大到小枚举可以 \(O(n\log n)\) 容斥求出 \(\gcd\) 恰好为 \(i\) 的方案数。
设值域为 \(m\),求异或和为 \(s\) 的直观做法是 FWT,单次 \(O(m\log m)\),设定阈值 \(B\),\(i\le B\) 时 FWT,复杂度为 \(O(Bm\log m)\)。
当 \(i\) 较大时,容易注意到 \(i\) 的倍数较少,而 \(k=4\) 代表着可以 meet in the middle,以 \(O(\left\lfloor m/i\right\rfloor^2)\) 的复杂度单次计算,总复杂度大致有一个上界 \(O\left(\dfrac{m^2}{B}\log m\right)\),取 \(B=\sqrt{m}\) 可以得到理论最优复杂度 \(O(m\sqrt{m}\log m)\)。
上面的计算都存在一个问题——卷积或是直接暴力计算时会出现同一个元素被选取多次,需要手动容斥去掉不合法的情况,有较多细节。
4.19 胡测 6
T1 数正方体
观察
假设 \(a=\max(a,b,c)\),那么这种情况合法当且仅当 \(a\le b\times c\)。我们考虑固定满足 \(b,c\) 的情况下最大的 \(a\),容易发现,当 \(b,c\) 都是形如 \(1\times b,1\times c\) 排列时得到最大的 \(a=b\times c\),因此必要性成立,充分性考虑 \(\max(b,c)\le a<a\times b\),因此在刚才的构造基础上挖去一些位置使得 \(b,c\) 同样成立即可,充分性成立。
\(A=B=C=n\)
分类讨论,\(a=b=c\) 和 \(a=b\neq c\) 的情况比较简单,记一下 \(a\neq b\neq c\) 的情况。
可以强制 \(a>\max(b,c)\),这样就只需要考虑 \(b\times c\ge a\) 一个条件,正难则反,改成求 \(b\times c<a\) 即 \(b\times c\le a-1\) 的方案数。
枚举 \(a,b\) 即可得到 \(c\) 的个数,推式子:
设 \(x=\left\lfloor\dfrac{n-1}{b}\right\rfloor\),且满足 \(\left\lfloor \dfrac{y}{b}\right\rfloor=x\) 的最大的 \(y=(x+1)\times b-1\)。
继续化简:
可以数论分块 \(O(\sqrt{n})\) 解决。
在此基础上只需要去掉 \(b=c\) 的情况。
正解
发现三个条件中最多只有一个不满足,因此可以分别计算三种情况,分析 \(a\times b<c\) 的情况。
实际上是把第二个求和号看做若干长度为 \(a\) 的整块以及最后的一个散块,分段去求。
同理也可以数论分块。
T2 数树上点
一个 \(O(n^2)\) 的 DP 是设 \(f_{u,d}\) 为 \(u\) 子树内选择点集最浅深度到 \(u\) 距离为 \(d\) 方案数。
合并两棵子树时是 \(d_1,d_2\) 贡献到了 \(\min(d_1,d_2)\),同时应满足 \(d_1+d_2\ge D\),转移只需要枚举这个 \(\min(d_1,d_2)\),讨论是哪个子树贡献出 \(\min\),加上后缀和优化。
状态只和节点以及深度有关,使用长链剖分优化 DP,直接继承重儿子的信息,轻儿子暴力合并,复杂度是 \(O(n)\) 的。
T3 数区间集
重点是同一个数最多出现两次。
设 \(b_i\) 为 \(a_i\) 另一次出现的位置,只出现一次设为 \(0\)。考虑只统计极大的区间,例如 \(\{1,2,3,3,4,5,2\}\) 中 \([2,4]\) 和 \([3,6]\) 都是极大的区间,而 \([1,6]\) 则不是,因此极大的区间指在不改变区间集合的情况下不能向两侧扩展的区间。
统计极大区间相当于统计 \(a_{l-1},a_{r+1}\) 在 \([l,r]\) 中没有出现,也就是 \(b_{l-1},b_{r+1}\notin [l,r]\)。考虑固定左端点 \(l\),如果 \(a_{l-1}\) 第二次出现或只出现一次则右侧所有位置都可能作为右端点,反之只有 \([l,b_{l-1})\) 内的位置可能作为右端点,而每个右端点 \(r\) 同理,如果 \(a_{r+1}\) 第一次出现或只出现一次则左侧所有位置都可能作为左端点,反之只有 \((b_{r+1},r]\) 内的位置可能作为左端点。枚举左端点,查询可能的右端点区间内部有多少 \(b_{r+1}<l\),二维数点即可。
考虑算重的情况,例如 \(\{1,3,2,2,4,3,1\}\) 中 集合 \(\{1,3\}\) 就被算重两次,而由于统计的是极大区间,因此算重的两个区间中间一定有其他数隔开。设 \(c_i\) 为如果 \(a_i\) 第二次出现那么第一次出现的位置,其余为 \(0\),这样我们在第二次出现位置统计答案,发现就是 \(\{c_l,c_{l+1},\dots,c_r\}=\{l,l+1,\dots,r\}\),也就是 \(c\) 数组的 \([l,r]\) 区间恰好覆盖了一个区间。应用经典套路 \(\max-\min=r-l\),线段树+单调栈同时维护即可。
注意到这样会删去一种特殊的情况,例如上面例子中 \(2\) 第二次出现会被删去但是实际上没有计入答案,这种情况即两个集合恰好相邻,表现为 \(\max+1=l\),可以在单调栈维护最大值时,当修改的区间 \([l,r]\) 满足 \(\max+1\in[l,r]\),线段树先给 \(\max+1\) 打上标记,不计入删去的答案,待最大值改变再撤去标记。