总结
'
11月20号总结
上午打了模拟赛,赛后补了t3,写一下思路:
把贡献拆边上,发现只有当子树内点是奇数的时候有贡献,可以dsu on tree,问题转换为有一个序列,颜色为黑白两色,求长度为偶数并且包含奇数个黑点的区间数,可以线段树简单维护一下。
下午写了构造
AT_agc035_c:
考虑异或的性质
那么连边 \((1,x)\),\((x,x+1)\),\((1,x+1+n)\),\((x+1+n,x+n)\),\(x\) 是偶数,就满足了 \(x\) 与 \(x+1\) 的限制,\(1\),\(n+1\)可以让\(n+1\)与\(x+1\)连边满足,\(n\)如果是偶数那么保证有一条\((n,n-lowbit(n)+1+n,1,n-lowbit(n),n+n)\)就满足了。
AT_arc103_d:
我们把重心定为根,发现了优美的性质:在一条链上,\(d_i\)随着深度增加单调递增。
这个结合\(d_{u}=d_{fa}-siz_u+(n-siz_u)\)很好理解。
然后我们把\(d_i\)从大到小排序,由于单调性我们已经算出了 \(i\) 的 \(siz_i\),然后也就知道了 \(d_{fa}\),二分出来这个东西的位置,然后更新 \(siz_{fa}\),如果不存在就无解。
但是实际上我们只是判断了父子之间的差值是否符合条件,所以还要暴力判一下某个点的 \(d_i\)是否符合。
CF1391E:
定 \(1\) 为根跑 dfs 树,如果深度有大于等于 \(\lceil \frac{n}{2} \rceil\) 的显然可以直接输出路径,否则层数小于等于 \(\lfloor \frac{n}{2} \rfloor\),同层配对必定满足条件的。
11月25号总结:
打了nfls模拟赛。
t1:拿出来所有石砖建图,是分层图,并且是dag,拓扑或者记忆化搜索,赛时没看出来是dag,dij没过
t2:分类讨论,发现金银铜最小值是 \(A_z+n\),剩下的最大值是 \(max+1\),然后枚举最小值就可做了
t3:区间dp,从数值小到大考虑 \(a_i\),然后如果不删除就分割了区间,删除了就下一个。
t4:先拆边,这样枚举所有点作为调整后的中点,最长链是 \(x\),可以把到所有叶子的链填满,然后之后增加的量也可以推出最多要填多少边,然后没了
11月26号
nfls。
t1:简单数位dp。
t2:我们从 \(x\) 出发可以把三个序列中 \(x\) 的后缀都删掉,然后继续删,最后会删完或者删不完,发现删不完的情况一定是三个后缀等长,所以三个序列中对于每一个 \(i\) 建边,第一个空隙前的数一定都能删完。
t3:先把 \(a_{i,j}=1\) 的都用并查集并起来,\(a{i,j}=2\) 的拿出来变成了连通块,一个连通块内的点建边随意,所以知道了树的形态,染色是容易的。
12月1号:
cf1781f:
设 \(f_{i,j,0/1}\) 表示长为 \(i\) 的合法生成方式,前缀 max 为 \(j\),上一步是外面套一个括号或拼接(这个是防止算重的)概率
\(f_{i,j,0}=p*f_{i-1,j+1}+(1-p)*f_{i-1,j-1}\)
\(f_{i,0,0}\) 还有特殊的贡献:\(f_{i-1,0}\)
\(f_{i,max(x,y),1}=C_i^k*f_{k,x}*f_{i-k,y}\)
前缀和优化一下可以 \(O(n^3)\)。
cf1580b:
性质:包含 \(i\) 的区间内的不同最大值个数是 \(i\) 在笛卡尔树上的深度。
证明:设区间为 \([l,r]\),最值在 \([l,i]\) 内,则最值在笛卡尔树上位置是 \(lca(l,i)\),是 \(i\) 的祖先,右边的情况是一样的,而所有 \(i\) 的祖先又必定都能取到,所以是深度。
只要保证父亲点的值大于儿子点的值,那么每一颗二叉树都对应一颗笛卡尔树,对应一个排列,然后有 \(O(n^5)\) 的暴力 dp,看似过不了 \(n\le 100\),然而这就是 std。
cf1174e:
感觉挺水的,不知道为啥2500,注意到首项一定是最大的 \(2^x\) 或者 \(2^{x-1}3\),人、后面的部分是简单组合。
cf1662c:
矩阵加速,我们设 \(a_{i,j}\) 表从 \(i\) 到 \(j\) 的路径长度为 \(k\) 的数,\(a_{i,j+n}\) 表从 \(i\) 到 \(j\) 的路径长度为 \(k-1\) 的数,然后容斥一下,没了
cf1453f:
按跳跃路径 dp 而不是最后保留的 dp,设 \(dp_{i,j}\) 表示跳跃路径最后两个点是 \(i,j\) 时需要删的最小点数,转移:
这是 \(O(n^3)\) 的。
发现两项相对独立,考虑分开搞,我们固定 \(i\),发现后面的很好搞,前面的相当于后缀取 \(min\),然后 $O(n^2) $ 做完了。
cf1842g:
组合意义考虑:
考虑从 \(i\) 到 \(i+1\) 有 \(a_i\) 种方案,修改的意义是在 \(j\) 放一个工具,走到这里时获得,每次向后走可以选择用某个已经获得的工具,方案是 \(v\),求总方案。
直接考虑:
拆贡献,我们之间乘法分配律硬拆式子,发现是对于每个
\(i\),钦定 \(a_i\) 和若干 \(v\) 中的一项,最后乘起来求和,注意到钦定的是很少的,所以状态可以少一些。
设 \(f_{i,j}\) 是考虑到 \(i\),钦定了 \(j\) 个工具的总贡献,有三种转移:
\(f_{i,j} \times a_i \rightarrow f_{i+1,j}\):钦定 \(a_i\)
\(f_{i,j} \times j \times v \rightarrow f_{i+1,j}\):钦定之前钦定过的 \(v\)
\(f_{i,j} \times (m-j) \times v \times (i+1) \rightarrow f_{i+1,j+1}\)
期望乘个概率就行。
cf1559e:
前两个限制好做,第三个搞个莫反,挺板的
12月8号:
今天写数据结构题单。
cf765f:
支配对,我们固定点 \(i\),然后找到最近的 \(a_j>a_i\),发现若想要找到 \(k\) 满足 \(a_k-a_i < a_j-a_k\),则 \(2 \times a_k -2 \times a_i <a_j -a_i\) ,即为 \(a_k-a_i < \frac{1}{2}(a_j-a_i)\),差值每次减半,所以递归找,复杂度 \(O(n log^2 V +qlogn)\)
P3688:
简单分析发现这东西是变成了单点加后缀和,再分析一下发现对于 \(l=1\) 的情况是 \(r\) 的前缀与后缀是否相等,其他情况是 \(a_{l-1} == a_r\),本来没注意到交换律想上矩阵乘法的,但是实际上只需维护相等概率,不相等是 \(1-p\),然后二维线段树或者 cdq。(实际上考虑矩阵乘法的意义,在这题中矩阵乘法是满足交换律的)。
12月11号:
cf662c:对于每一列,把行状态压缩,考虑枚举反转哪些行,设 \(g_i\) 表示状态为 \(i\) 时的代价,\(h_i\) 为状态为 \(i\) 的列的个数,则枚举一个 \(S\),代价为
fwt 可做。
P5933:
好题,使我学会子集卷积求逆。
考虑我们有很典的正难则反,可以写出 \(O(3^n)\) 的 dp 式子:
移项:
\(p\) 是最高位元素,\(S_1\) 是\(S-p\)。
考虑拎出来所有包含 \(n\) 的 \(g_S\) 设为 \(g1\),剩下的设为 \(g2\),写成子集卷积形式就是:
子集卷积除法:
实际上只是把子集卷积里的多项式乘法换成了除法。
我不知道为什么是对的。
暴力 \(O(n^2)\) 多项式除法挺简单的,不写了。
12月12号:
cf1342f:设 \(dp_{i,s,v}\) 为 最后一个为 \(i\),使用集合为 \(s\),最后的值为 \(v\) 的最小操作数,然后交换答案和定义最后一维,转移挺好想的不写了。
cf1392h:期望好题,首先抽到鬼牌后局面是一样的,我们称一直抽牌然后抽到鬼牌为一轮,答案是:
有 \(m\) 张鬼牌,则普通牌在鬼牌前的概率是 \(\frac{1}{m+1}\),期望抽牌数就是 \(\frac{n}{m+1}+1\)。
轮数可以递推,设 \(f_k\) 为集合剩余 \(k\) 张时的期望轮数:
又有\(f_0=1\),故 \(f_n=\sum_{i=1}^{n}\frac{m}{i}+1\)
然后没了。
cf1152f:
应该是第一道自己独立切的黑(实际上很水)
考虑从小到大插数,那么因为限制很严,我们只需考虑 \([i-m,i-1]\) 的数是否出现过,如果出现过可以放它们后面,否则开头, dp 式子很好写,加强版就是矩阵加速一下
12月22号:
写dp。
最佳团体:01分数规划板子
MYJ:区间dp,设 \(dp_{l,r,k}\) 表示考虑 \(l,r\) 内的洗车服务,最小值是 \(k\) 时的最大收益,转移时枚举最小值。
区间 dp 枚举最值的思路好像见过较多次了。
Omkar and Last Floor:显然如果一个区间包含列的最值,那么 \(1\) 移动到最值处一定更优,所以枚举最值位置做区间 dp。
一直在你身旁:运用了很多单调性的东西。
首先暴力 dp 是:
然后考虑 dp 数组若固定一个端点,那么值关于另一个端点单调,那么存在一个分界点 \(k\) 满足:
然后不想写了。
Secret Passage:
大战题解2小时,拼尽全力无法战胜。
先转换成保留的字符可以先不插入,提取出来等用到时在插入,最后一定是一个后缀 \(s[i+1:n]\) 和一些 \(0,1\) 插入到后面,写成三元组就是 \((i,j,k)\) 表示后缀是 \(i\),\(0,1\) 数量是 \(j,k\)。
它们对应形成的字符串可以 dp 算出,\(f_{i,j,k}\) 表示匹配到 \(s[i+1:n]\),有 \(j\) 个多余的 \(0\) 和 \(k\) 个多余的 \(1\),转移是我们强制只能让多余的 \(0\) 和 \(1\) 失配,即拼在原串 \(0\) 和 \(1\) 的后面,但是这里虽然说得是后面,实际上原串的 \(0\) 和 \(1\) 是在 \(f_{i,j,k} ->f_{i-1,j,k}\) 时才真正被拼上去。
并不是所有的三元组都合法,我们再搞个 dp 算出。
设 \(vis_{i,j,k}\) 表示 \(s[1:i]\) 删光,\(s[i+1:n]\) 不动,有 \(j\) 个多余的 \(0\) 和 \(k\) 个多余的 \(1\),转移没有精确地与我们转换后的题意相匹配,但是能保证覆盖所有合法字符串就行。
Nondivisible Prefix Sums:
考虑众数:我们不妨设众数为 \(1\),若不是 \(1\) 就都乘上一个逆元。
首先排除掉所有和为 \(p\) 倍数的数列。
设众数有 \(n-m\) 个,剩下数为 \(b\),则有解的必要条件是
$ n-m \le p-1+\sum_{i=1}^m p-b_i $$。
若不满足,那么 \(n-m+\sum b_i \ge (m+1) \times p\),考虑每次跨过 \(p\) 的倍数时都不能使用 \(1\),但是要跨过 \(m+1\) 次,不为 \(1\) 的又只有 \(m\) 个,所以必要。
事实上它也是充分的,给出一种构造策略:
设当前和为 \(sum\),剩余数众数为 \(x\),若 \(sum+x\) 合法,则拼一个 \(x\),否则再找一个 \(y\),拼一个 \(y\),再拼一个 \(x\)。
我们如果合适地选择 \(y\),即每次选取出现次数最多的,那么每个数出现次数会相对均衡,如果一个数曾经是众数,那么它与 \(x\) 的个数差不会超过 \(1\)。
我们考虑构造失败的情况,即找不到合适的 \(y\),这说明剩下的数都是 \(x\),又因为和不为 \(p\) 的倍数,所以至少有两个 \(x\),根据上面的结论,我们判断 \(x=1\) 且一直是众数,那么情况会和第一个不等式相反,于是我们证明了充分性。
计数正难则反,但是众数可能不是 \(1\),考虑非法时一定是绝对众数,则方案数乘 \(p-1\) 也不会算重。
Sum of Number of Divisors of Product:
考虑因数式子:\(\prod(c_i+1)\),我们乘一个 \(x\),设 \(g_{x,i}\) 表示 \(x\) 含多少个第 \(i\) 个质数,因数变为 \(\prod_{i\in S}(c_i+g_{x,i}+1)\)
考虑式子展开,\(\sum_{T \subseteq S}\prod_{i \in T}(g_{x,i})\prod_{j \in S-T}(c_j+1)\)
这时实际上就是一个状压 dp 的形式了,设 \(f_{i,S}\) 表示只考虑集合 \(S\) 内的质数的因数个数,转移矩阵加速一下。
Avoid Half Sum:
结论:若存在 \(i\) 满足小于 \(a_i\) 的奇数个数小于 \(a_i-1\),则有解。
The Maximum Prefix:
好题,有很多思路,先学习了其中一种推贡献系数的。
考虑求最大前缀和的另一种方式:从后往前求,考虑求出了 \([i+1:n]\) 的最大前缀和,只需考虑 \(a_i\) 选不选,\(mx=\max(0,mx+a_i)\)。
然后我们就可以从后往前 dp,设 \(f_{i,j}\) 表示推到了 \(i\),最大前缀和为 \(j\)概率。
初始值 \(f_{n+1,0}=1\),答案 \(ans=\sum_{i=0}^nh_if_{1,i}\)
但是问题是我们要做 \(n\) 次 dp,每次 \(O(n^2)\),会炸。
注意到我们每次递推形式是相同的,只有初始值不同,我们可以求出每个 dp 位置对答案的贡献系数,设系数为 \(g_{i,j}\)。
注意到与上面的递推式刚好是反的,如果理解意义就能理解这是很自然的。
初值 \(g_{1,i}=h_i\),答案 \(g_{i+1,0}\)。
简单算术:
结论: \(F(x)^p \equiv F(x^p) \pmod{p}\)。
右边多项式次数是 \(b\times n\) 的,能枚举的 \(i\) 有限,左边递归算,能发现状态分布是较连续的并且每层会多 \(O(n)\) 个状态,转移 \(O(n)\) 共 \(O(\log m)\) 层,右边的多项式预处理出来,复杂度 \(O(n^2p^2+Tn^2\log m)\)
1月4号:
打nfls,补提。
t2:想到了块状 dp,但是没想到拆分数结论,,
我们考虑从大到小按块状 dp 的方式插入每个数,对于每个 \(i\) 有一个 \(mx_i\) 表示插入完 \(i\) 后最长块长度应该恰好为 \(mx_i\)。
转移还是每次新建一块,插入到一块的两侧,合并两块。
但是要是正常设 dp 状态完全没法做,因为要保证最长块长度,只能记录所有段的长度。
但是发现这是拆分数级别的,而 \(n \le 50\) 的拆分数求和也就 \(10^6\) 级别,于是我们暴力存下每种状态,但是 vector 被卡常了。
我们有剪枝:若剩下 \(i\) 个数,至多合并 \(i+1\) 块,最后要求的是只余一块的状态,所以块数大于 \(i+1\) 的直接剪掉就行,跑的飞快。
t3:
分类讨论,接下来只写都在子树外的情况。
路径交集会有一段在 \(x\) 到 \(1\) 的路径上,这个端点必定是 \(x\) 在区间内的 dfn 序的前驱后继与 \(x\) 的 lca中的较深的那一个。
还有一段可能是端点向各个点,求出来所有点的 lca 判一下就行了。
gosha is hunting:
wqs二分题,二分去掉一个限制,剩下 \(n^2\) dp。
好像有二维 wqs 二分厉害做法,但是没学会。
铁人两项:
确定 \(s,f\) 后,可以选的 \(c\) 是 \(s,f\) 在圆方树上路径的点双的并,可以给方点权值定为点双大小,圆点定为 \(-1\),那么就是路径权值和,并且顺便解决了路径点不同的问题,剩下的简单做。
月球列车:
位运算和加法混一块看起来很吓人,但是具体分析就发现我们拆位,答案的第 \(j\) 位相当于 \(a_i\) 的第 \(j\) 位异或 \(v\) 的第 \(j\) 位再异或是否前 \(j-1\) 位是否进位。
只要解决进位就行了:\(a_i \& (2^j-1)+ v \& (2^j-1) \ge 2^j\)
\(a_i \& (2^j-1)\ge 2^j-v \& (2^j-1)\)。
可以把数组预处理出来排序,然后每一位二分找进位,复杂度 \(O(n \log n \log v)\)。
排序可以按桶排的思想做到 \(O(n \log v)\),实际上后面的也可以优化。
设上一位进位了 \(x\) 个,降序排序后肯定是一段前缀,我们具体分析第 \(j\) 位:若 \(v_j=1\),则能进位的是这一位为 \(1\) 的和上一位进位,这一位为 \(0\) 的。
若 \(v_j=0\) 能进位的是这一位为 \(1\) 的并且上一位进位了的。
排完序后对于每个前缀记录下一位为 \(1\) 或 \(0\) 的数量。\(O((n+m)\log v)\)。
Isolation:
首先有显然的 \(O(n^2)\) dp,然后考虑加入一个数时的贡献变化是:\([pre_i,i-1]+1\),\([pre_{pre_i},pre_i-1]-1\)。
我们要维护的操作就是区间加减 1,求值小于等于 \(k\) 的权值和。
可以分块:每个块开一个数组 \(s_i\) 表示值为 \(i\) 的权值和,每个块维护 \(tag\) 表示偏移量,然后每次区间加减删掉对应贡献,没了。
chosing aids:
考虑 \(p > 50\) 就是绝对众数,我们每次删掉两个不同的数,至多删 \(\frac{n}{2}\) 对,所以绝对众数肯定删不完,使用线段树加速这一过程。
而这个做法可以扩展:我们设 \(k=\frac{100}{p}\),每次删去 \(k+1\) 个不同的数,至多删 \(\frac{n}{k+1}\) 对,要求的数是 \(\frac{n}{k}\) 的,还是使用线段树,最后会多一些数输出,但是题目只要求包含正确的。
最小 mex 生成树:
考虑 mex 实际就是去掉所有特定边权的边还联通,可以使用线段树分治,然后没了。
Building Forest Trails:
好玩的题。
注意到重要的性质:联通块的边的形态其实并不重要,我们直接在联通块内相邻点建边,这样也是本质一样的。
这个很好感性理解。
然后又发现这样的话最后一条边是不必要的,于是我们可以断环了。
然后设 \(h_i\) 表示有多少边跨过点 \(i\) ,注意端点处没贡献。
考虑加边操作,不妨设 \(x<y\)。
如果 \(h_x>h_y\) 那么必定有一条边包含了点 \(x\) 所在联通块,我们找到最左边的点 \(p\) 满足 \(h_p<h_x\),它肯定是那个联通块的端点,会跨过新的边,合并。
\(h_x<h_y\) 同理,如果 \(h_x==h_y\) 那么可能还存在 \(p\),若不存在直接合并两点。
合并也是简单的:联通块关系只有不交或者包含,分析一下就行。
可以使用线段树维护。
Frequency Problem:
神秘结论题。
结论是一个最长区间的众数中必定包含总区间的众数。
证明很简单,因为如果不包含还能再扩张,一开始是小于,最终是大于,那么有一刻当前众数和总区间众数的数量是等于,设众数为 \(mx\)。
然后枚举另一个数是多少,设它为 \(x\),我们考虑如果能设计出一个与 \(cnt_x\) 线性的算法就解决了。
把 \(x\) 权值设为 \(-1\),\(mx\) 权值设为 \(1\),那么求最长区间相当于求最长和为 \(0\) 区间。
这实际上是有 \(O(cnt_x)\) 算法的。
我们考虑两个前驱后继出现的 \(x\),它们中间的上升段有哪些是有用的:设前面前缀最大值是 \(hmax_i\),后面前缀最小值是 \(hmin_i\),则只有 \(j \le hmax,j \ge hmin\) 是有贡献的,画折线图显然。
我们可以只枚举这一部分,这是 \(O(cnt_x)\) 的,考虑如果 \(j \le hmax_i\),那么一定是前面有一些 \(x\) 走了下来,它可以对应上一次走到这的 \(x\),如果 \(j \ge hmin_i\) 类似。
于是做完了,别忘了所有 \(x\) 也可以成为贡献点。
into blocks:
想出来了线段树分治做法,但是没写。感觉题解做法更具启发性一些。
我们考虑如果两个数一开始相等,那么最后也一定相等,那么考虑一种数出现的区间 \([s_i,t_i]\),这个区间内的数最终相等。
那么最后会有一堆区间,相交的区间要求都相等,我们考虑一种经典的处理方式:\([s_i,t_i)\) 区间加,最后为 \(0\) 的地方把数组断成了一堆区间,每个区间不用操作的数是众数。
我们考虑如何维护:发现一个区间一定是完整的包含了一种数,不妨把数的出现次数放在左端点,问题就变成了:
两个数组 \(a_i,b_i\) 以 \(b_i=0\) 断开后求 \(\sum \max a_i\)。支持 \(a_i\) 单点改 \(b_i\) 区间加。
可以尝试使用线段树,每次合并左右儿子两个相邻段就行,但是发现打 tag 太难了啊,一个很典的东西是 \(0\) 是最小值,我们考虑把题意换成按最小值分段,那么考虑到 \(b_n=0\) 这样是等价的。
我们发现打 tag 好打了,合并的时候讨论最小值在左区间还是右区间就行了。
于是 \(O(n \log n)\) 完成。
1月9号:
Raffles:
考虑每次多放一张票的增量是递减的,所以可以贪心,每次取最多的增量,。
还有修改操作,但是发现这个修改实际上就是平移了贡献,我们可以一直反悔,每次反悔最多一次,我们开两个 multiset 维护贡献,复杂度 \(O(n \log n)\)。
Huffman Coding on Segment:
要求的东西显然就是哈夫曼树,我们考虑根号分治:
对于出现次数小于 \(B\) 的,我们开桶 \(cnt_i\) 表示出现了 \(i\) 次的数有多少个,可以 \(O(B)\) 建哈夫曼树,出现次数大于 \(B\) 的做合并果子,复杂度 \(O(B+\frac{n}{B} \log \frac{n}{B})\),我们取 \(B=\sqrt{n \log n}\) 做根号平衡,使用莫队维护区间内数出现次数。
技巧:检查出现次数 \(\ge B\) 的可以先把全局出现次数 \(\ge B\) 的存下来,然后每次枚举这些数检查在现在区间内是否还合法。
三色树:
很套路,先求无标号有根树,然后维根节点无黄点的有 \(i\) 颗树的方案数和有黄点的方案数。
转移暴力,最后做一个拼接钦定重心为根,容斥掉不合法贡献,这样就统计了无根树。
Sub-cycle Graph:
显然最后形态就是一堆链和一堆点,我们不妨先枚举掉点,推出链的 egf 是 \(F(x)=\frac{1}{2}\frac{x^2}{1-x}\),答案是 \([x^n]n!\frac{F(x)^m}{m!}\),是好求的。
Subtree Value:
暴力做法是每个点做树形背包,背包里存一个多项式,最后带入求值。
但是有模数 \(U^V\),如果最后 \(U|x\) 那么箱数不超过 \(V\),我们把每个 \(x\) 拆成 \(Uz+y\),然后枚举 \(y\) 把它当作偏移量加到 \(a_i\) 中,然后可以 \(O(n^2UV^2)\)。
卡常技巧:模数不是 c++ 常量并且取模多的时候可以开 __int128 暴力存下值的和,这样不用每次运算完都取模了,可以控制取模次数。
1月9号:
随机正方体:
一些很有用的性质:
任意两个极大点任意三维都不同。
极大点个数是 \(\min(n,m,l)\) 级别的。
我们设 \(f_i\) 表示钦定 \(i\) 个极大点的概率,\(c_i\)
表示极大点控制的点数,\(g_i\) 为选出极大点的方案数(有序),\(h_i\) 表示填入极大点控制点的方案数
我们从大到小考虑:最大值肯定填给最大的极大点,然后我们只考虑只被最大极大点覆盖的点,这些显然是随便放,然后变成了子问题,所以 \(h_i=c_i!\prod\frac{1}{c_j}\)。
剩下两个显然:\(c_i=nml-(n-i)(m-i)(l-i)\),
\(g_i=\prod(n-i)(m-i)(l-i)\)。
\(f_i=g_i\prod\frac{1}{c_j}\)。
这个要上一点技巧做到 \(O(n+\log p)\) 求出每一项逆元,实际上就是先求所有乘积的逆,然后往前推。
然后二项式反演。
Research Rover:
首先恰好转成钦定,我们设 \(dp_{i,j}\) 为走到了第 \(i\) 个点,钦定经过了 \(j\) 个黑点的方案数,转移就是枚举上一个钦定的黑点和钦定的个数,复杂度 \(O(n^3)\) 显然过不去。
那么我们发现实际上经过黑点次数大于 \(\log s\) 的话权值一定为 \(1\),不需要我们关注,考虑把容斥系数压到 dp 过程里的优化,我们写出二项式反演的式子。
可以每次钦定都乘上 \(-1\) 的容斥系数,\(\binom{j}{i}\) 可以看成在 \(j\) 个钦定的点中选出 \(i\) 个的方案数。
于是我们重新设计 dp 状态:设 \(dp_{i,j}\) 表示走到了第 \(i\) 个点,在钦定的点中选了 \(j\) 个的方案数。
第二维是 \(O(\log s)\) 的,所以复杂度是 \(O(n^2 \log s)\)。
氪金手游:
题目给的奇怪性质指的是图弱联通。
考虑外向树情况,首先概率只与子树和有关:设 \(f_{i,j}\) 表示点 \(i\) 子树和为 \(j\) 合法概率,\(O(n^2)\) 树形背包转移。
有反边怎么办?容斥,钦定它不合法,它就变成正的了,或者消失。
复杂度还是 \(O(n^2)\)。
A Random Code Problem:
发现 \(720720 =lcm(1,2,3...16)\)。
我们设 \(dp_{i,j}\) 表示 dp 到第 \(i\) 轮,与 \(j\) 同余的期望数个数,然后暴力转移。
复杂度 \(O(n+kP)\),\(P=720720\)。
Strange Operation:
好题,我们考虑先忽略两端的 \(0\),拿出每相邻两个 \(1\) 之间 \(0\) 的个数,那么操作就是每次选一个非零数减减,或者删掉一个零。
考虑一个零一串显然与一个上文的序列一一对应,若 \(b_i\) 合法,那么当且仅当能找出子序列 \(a_i\) 满足所有 \(a_i \ge b_i\)。
我们确定存在性的时候是贪心的匹配,计数也可以基于这个,\(f_i=\sum_jf_j\times \max(0,(\max_{k=j+1}^{i-1}a_k)-a_i)\)。
然后这个可以使用单调栈优化转移,没了。
歌唱王国:
pgf 好题。
我们设恰好 \(i\) 出现的 pgf 为 \(f(x)\),到 \(i\) 还没出现的 pgf 为 \(g(x)\)。
根据 pgf 的性质有:\(f(1)=1\),\(f'(x)=E(X)\)
于是我们的任务变为求 \(g(1)\)。
考虑这样一件事:我们在某个没有出现的时刻 \(i\),强制钦定后面拼一个 \(s\),概率显然为 \(g(x)(\frac{1}{m})^n\),另一种算法是考虑 border 因为可能在强制钦定拼完前由于某个 border 导致 \(s\) 已经出现,概率为 \(\sum_{t=border}x^{n-t}f(x)(\frac{1}{m}^{n-t})\)
完成。
1月10号:
打 nfls 模拟赛。
t1:发现我们只关注数位和,那么从后往前模拟做就行了,或者直接统计数位和处理。
t2:不严的下界显然是 \(n+m-2\),然后我们发现在 \(n,m\) 都为偶数是不成立,下界是 \(n+m-1\),我们可以轻松的构造出一个王字状物来达到下界,然后发现上界一定是 \(nm-1\),我们只需选出两条左上和右下的主链,用 \((1,1)\) 和 \((n,m)\) 分别蛇形扩展就行。
t3:运水的形态是生成树,,,然后发现一个生成树上的所有点的点权一定是原来的权值和减去边权和取平均值,挺显然的。
然后就是枚举每个子集求出最小生成树,然后 \(O(3^n)\) 做子集划分 dp。
t4:
\(k=1\):划分数。
\(k=2\):最佳的还原策略是降序排序,然后第 \(i\) 个元素对应多少的 \(i\),发现最多 \(O(\sqrt n)\) 项,背包。
\(k \ge 3\):发现和是 \(O(\sqrt n)\) 级别,可以暴力搜索,复杂度大概是 \(\sqrt n\) 的划分数,然后暴力搜所有答案。
Bus Routes:
条件换成对每个叶子检验是等价的,然后考虑对所有叶子处理出 \(mn_i\) 表示能到达的最浅祖先,然后合法的必要条件是所有 \(mn_i\) 都是祖宗关系。
这只是必要的,但是发现如果必要条件合法那么它们都在一条链上,再找出最深的 \(mn_i\),以它为根再搜一遍 \(mn_i\),若所有叶子都能到达,则合法,否则不合法。
Centroid Probabilities:
重心的一种定义是最深的子树大小超过 \(\frac{n}{2}\) 的点,我们使用这个求。
设 \(m=\frac{n}{2}+1,f_i\) 表示点 \(i\) 子树大小超过的方案数。
后面的是上指标求和,然后可以 \(O(1)\) 求,然后做完了。
线段树分裂:
考虑暴力分裂,线段树合并的复杂度分析是每个点至多被删一次,那么分裂至多多出 \(\log\) 级别的点,相当于多了 \(\log\) 能删的点,所以复杂度还是 \(O(n \log n)\)。
萌萌哒:
倍增优化并查集合并,首先肯定是对应位置相等,\(f_{i,j}\) 表示从 \(i\) 开始向后 \(2^j\) 个点,从大到小枚举 \(j\) 向下劈就行。
P10805 [CEOI2024] 加油站:
巨大点分治题,首先点分治处理路径。
路径分为向上和向下两部分,向上可以使用倍增出最浅的 \(dis \le k\) 的点加加,向下把贡献算在 \(dis>k\) 的点,然后处理父亲。
然后没了。
P5298 [PKUWC2018] Minimax:
线段树合并,动态地维护前缀和后缀的概率辅助 dp 数组转移。
注意为空的线段树合并,调了好久,,,
P4211 [LNOI2014] LCA:
可以使用全局平衡二叉树解决。
全局平衡二叉树可以单 \(\log\) 做链加链求和,子树加子树求和。
我们对于每条重链拿出来加权,每个点的权是它的子树大小刨掉重儿子大小,找出加权中心当作根,左右递归建二叉树。
根向链顶在原树中的父亲再建边。
容易证明树高 \(O(log n)\),并且由于树的结构,链加变成子树加,我们直接暴力跳处理。
1月22:
莫队二次离线:
比较典的:区间逆序对数量查询。
这种每次移动时贡献可差分的并且不好 \(O(1)\) 的可以考虑二次离线。
询问 \([l,r-1]\) 内大于 \(a_{r}\) 的可以差分成两个前缀询问,一个是 \([1,r-1]\),一个是 \([1,l-1]\) 第一类贡献是固定的,在移动指针的时候可以直接维护,我们要处理第二类,根据莫队结论可得区间长度和 $O(n \sqrt n) $ 级别,于是问题是 \(O(n)\) 次修改 \(O(n \sqrt n)\) 查询,值域分块。
长链剖分:
把重链剖分的子树大小换成了最深深度。
结论:暴力跳轻链级别是 \(O(\sqrt n)\)。
\(x\) 的 \(y\) 级祖先所在长链长度大于等于 \(y\)(可以做树上 \(k\) 级祖先)。
都挺显然的。
长链剖分还可以优化与深度相关的 dp,每次继承重儿子的信息,轻儿子暴力合并,每个点只会在链顶被合并一次, \(O(n)\)。
1月23号:
写了长链剖分。
Freezing with Style:
先二分,然后每个点维护一个子树内长为 \(i\) 的链最大和,看起来就很长剖。
考虑每条长链维护一颗线段树,区间查询一个最值,暴力合并,打标记都是简单的。
然后很不好写,可以用 dfn 序把所有长链拍成连续的区间,然后只用一颗线段树了,虽然慢,但是好写了很多。
拉格朗日反演:
首先要接受所有负指数和多项式逆。
若函数 \(F(x),G(x)\) 满足常数项为 \(0\),一次项不为 \(0\),\(F(G(x))=x\),则有拉格朗日反演:
首先有引理:
分类讨论:
\(k!=-1,F'(x)F(x)^k=\frac{1}{k+1}(F(x)^{k+1})'\)$,显然为 \(0\),
\(k=-1\) 自己推吧。
然后推一下:
还有扩展:
练习:
求卡特兰数生成函数 \([x^n]C(x)^k\)
有 \(\frac{F(x)}{(1+F(x))^m}=x\)
设 \(G(x)=\frac{x}{(1+x)^m},G(F(x))=x\)
\([x^n]F(x)=\frac{1}{n}[x^{n-1}](\frac{x}{G(x)})^n=[x^{n-1}]\frac{1}{n}(1+x)^{nm}\)。
AT_abc222_h:
跳过 dp 式子环节。
反演求 \(\frac{1}{n}[x^{n-1}](x+(1+x)^2)^{2n}\)
二项式展开一下就求完了。
集训期间:
...好きです:
另一种线段树分治。
我们还是把点的存在时间拆成 \(\log\) 段区间,但是我们在这里把询问也拆成 \(\log\) 个放到所有包含它的区间里。
左右分别扫一遍去掉绝对值,根据结论,可能成为答案的点构成上凸壳,建凸壳,求答案时分别左右走就行了,能证明每个点只会经过常数次。
我们事先把点和询问按 \(x\) 坐标都排序,再插入,这样就免去每个线段树节点内的排序,复杂度 \(O(n \log n)\)。
新年的小黄鸭:
线段树合并优化 dp 板子。
重点在于我们对线段树合并点数的分析:我们按先遍历重儿子的顺序 dfs,每次立刻合并重儿子,那么总点数是 \(O(n)\) 的。
我们对最劣情况满二叉树分析,那么存在 \(2^0,2^1...2^k=n\) 个轻子树保留了自己的线段树。
我们再对线段树的结点分析:对于 \(2^i\),不妨设前 \(i\) 层都是满的,后 \(k-i\) 层结点数是 \(2^i \times (k-i)\),发现求个和还是 \(O(2^k)=O(n)\) 级别的。
qoj 3998:
显然具有单调性。
对于这种题,如果支持删除可以上双指针,不支持删除但是支持合并可以上 bakas trick,都不支持只支持插入和撤销可以上整体二分。
我们定义 \(slove(s,t,l,r)\) 表示 \([s,t]\) 内的左端点,最小右端点在 \([l,r]\) 内,每次取出 \([s,t]\) 中点,暴力扫求出答案,然后类似决策单调性分治那样劈成两半递归,复杂度 \(O(nk \log n)\)。
最小差值生成树:
跟上一题差不多的套路,但是我们为了保证每次处理时复杂度至于两个区间的长度有关,要把 \([t+1,l-1]\) 内的边在递归前加进去。
跑飞快吊打 lct。
沉玉谷:
区间 dp,还是考虑右端点消除的关系,我们和消除方块那题不一样,转为枚举最后一个和右端点一起消除的点,\(f_{l,r,k}\) 表示区间 \([l,r]\) 消除了 \(k\) 次,\(g_{l,r,k}\) 表示区间 \([l,r]\) 消除了 \(k\) 次并且左右端点是同时被消除的,转移是简单的。
摩天大楼:
连续段 dp 部分是简单的,重点在于拆贡献:
我们把绝对值看成线段拆成一段一段,每段是数组内相邻两个数的差分值。然后加数,这样就能保证贡献单增,于是做完了。
Examination:
使用 hall 定理,存在匹配条件为 对于所有 \(v\),\(\sum[a_i\le v]\le\sum[b_i \le v]\)。
只保留所有 \(a_i<b_i\) 点,我们在 \(a_i\) 处减减,\(b_i\) 处加加,加入一个新点的贡献是 \([b_i,a_i)\) 区间加 \(1\),要选出最少区间使得所有位置大于 \(0\),这是经典贪心,从前往后考虑,每次选出右端点最右的线段。
stcm:
首先把子树拍成 dfn 区间,然后考虑分治,发现因为是子树,区间要么包含要么不交。分治,每次处理跨过中点的区间,从左往右删除。
nobody is needed:
类似支配对的东西。
首先有用的不同子序列端点是 \(O(n \log n)\) 级别的,然后暴力做个 dp 更新一下固定左右端点的合法子序列数,二维数点,复杂度 \(O(n \log^2n)\)。
Hello, Solitude.:
首先设 \(f_{i,j,k}\) 表示长度为 \(i\) 的区间,放了 \(k\)个,\(j\) 被覆盖的方案数,然后我们发现这个很适合写成 egf。
\(F_{n,k}(x)=\sum_i\frac{f_{n,k,i}}{i!}x^i\)
\(f_i=A_n^i\) 的 egf 是 \((1+x)^n\)
egf 的平移操作相当于不定积分。
根据经典线段树结论我们知道会被访问到的 \(F_{n,k}\) 是 \(O(n)\) 的,然后转移式是:
偶数和中间的情况也是简单的。
然后我们把 \(F_{n,k}(x)\) 反演成 \(G_{n,k}(x)=\sum a_p(1+x)^p=F_{n,k}(x)\)。
转移就很好转移了,我们观察到每个非零项都是 \(len-m\) 的形式,\(m\) 是某个被访问到的长度。
然后暴力做,注意积分的时候要选取合适常数保证常数项为 \(0\)。
2月20:
信号传递:
状压从前往后填,枚举当前填 \(i\),我们把与 \(i\) 有关的贡献都拆到当前位置,发现是好算的,预处理然后 \(2^n\) dp 即可。
但是被卡空间了!我们再优化:考虑写成 cdq 分治形式,每次考虑最高位的转移,然后先处理左区间,左区间加入最高位转移右区间,然后处理右区间,这样同时只需要存一个数组,就可过了。
滚榜:
注意题意不是先隐藏所有人排名然后一个一个公开!最开始的榜是原始的榜。
我们考虑最暴力的 \(dp\) 是 \(O(n^22^n m^2)\) 的,看起来最后一维记录 \(m\) 的可以优化。
注意到 \(b_i\) 单增,对它做差分,然后我们发现差分值的计算只与相邻两项的 \(a_i\) 有关:把少的补成多的,如果本来就是较大的就不用补。
于是就删去了最后一维,复杂度 \(O(n^22^nm)\)。
建造军营:
缩边双,转成树上 dp 问题,选出来的点必须选边联通,然后树形 dp。
Complete Compress:
不会一点。
枚举终点,那么对于一个子树 \(x\),我们想要把所有子树内点移到 \(x\),有两条性质:
选两个祖宗后代必定不优,必定先选子树内点再考虑子树外点。
我们考虑对于一种局面,每个儿子内的黑点深度和是 \(a_{son_i}\),那么如果没有超过总和一半的数,就一定能达到 \(0\) 或 \(1\) ,与奇偶性有关。
做树形 dp,对于每个点求出最小最大可行深度和,在区间内奇偶性与端点相同的都能取到,在儿子中找出最大的最小可行深度和,设为 \(mx\),然后我们想要求能不能可行,于是会把其他的儿子都调到最大(如果最大大于 \(mx\) 就取为 \(mx\)),和设为 \(s\),如果 \(2 \times mx \le s\) ,就合法,否则是 \(s-2\times mx\)。
修行:
求欧拉数 \(n,m\),\(n,m\le 10^5\)。
考虑容斥,\(f_i\) 等于钦定,每次钦定一个上升关系相当于合并两段,所以最后有 \(n-i\) 段,相当于划分成 \(n-i\) 个带标号非空子集,显然可以容斥(实际上也可以写成斯特林数乘阶乘)。
6.26
模拟赛t3 不:
如果钦定一个 \(a_i\) 作为答案里的东西,那么对它做因数分解和质因数分解,在因数数组上做高维前缀和复杂度是 \(O(\phi(n)f(n))\),第一个函数是因数个数,第二个是质因数个数,然后随机化几个 \(a_i\) 取最大值正确率是 \(1-\frac{1}{2^k}\)。
All Pairs Similarity P:
可以看成所有东西和自己分别做 fwt,然后可以倒推出贡献系数。
或者看这个:
我们考虑给每条边随机赋权,那么可以利用 lgv,如果 \(k\) 个点行列式不为 \(0\) 说明存在一个最大合法匹配,但是为零呢?我们取出线性基考虑,发现线性基大小就是最大匹配。
维护前缀线性集,线性基中最小值位置往后都是大小为 \(k\) 的部分,同理次小值往后直到最小值都是大小为 \(k-1\) 的部分,于是我们完成了统计。
一个很错的思路是把边变成点,对于一个点,它的所有入边向出边连随机赋权的边,最后求解一个点所有入边的线性基。
这样复杂度是错的,但是我们发现对于出边我们做的事相当于是把入边的向量进行了随机线性组合,这其实相当于对入边向量的线性基做随机线性组合,这样复杂度就是对的了。

浙公网安备 33010602011771号