P3488 [POI2009] LYZ-Ice Skates
我们对于鞋码为 \(x\) 的人,贪心地,显然先把鞋小的给他穿。
所以就有了一个暴力的检验方法:从左往右扫,并对应修改。但是这样太慢。
这是一个二分图匹配问题,考虑 Hall 定理。
对于任意 \(1\le l\le r\le n\),当 \(sum(a_l\sim a_r)\le(r-l+1+d)k\) 时合法。
即 \(\sum_{i=l}^r (a_i-k)\le dk\) 时合法,我们只需要线段树维护最大子段和。
AGC001E
我们能用的信息是 \(A_i,B_i\) 很小。我们还要考虑的是组合数的性质。
令 \(s_i=a_i+b_i\),那么我们对于 \(i,j\) 来说,就是 \(s_i+s_j\) 里面取出 \(a_i+a_j\) 个。
枚举 \(i,j\) 分别取了多少,\(C_{s_i+s_j}^{a_i+a_j}=\sum_{k}C_{s_i}^{a_i-k}C_{s_j}^{a_j-k}\).
总和是 \(\sum_{i=1}^n\sum_{j=1}^n\sum_kC_{s_i}^{a_i+k}C_{s_j}^{a_j-k}\),令 \(F(x)=\sum_{i=1}^n \sum_k C_{s_i}^{a_i+k}\),故 \(Ans=\sum_{k}F(-k)F(k)\).
对于每个 \(a_i\) 我们来算贡献。贡献是 \(x^{-d}\times (1+x)^{s_i}\) 形式的,\(d\) 是一个偏移量。
\(s\) 相同的合并同类项,\(F=\sum_{i=0}^m Q_i(x) (1+x)^i\),\(Q_i(x)\) 为 \(s=i\) 的 \(\sum x^{-d}\).
观察题解我们发现了另一种做法,\(C_{s_i+s_j}^{a_i+a_i}\) 就是 \((0,0)\) 走到 \((a_i+a_j,b_i+b_j)\) 的方案数。
但是只有 \(O(1)\) 个起点和 \(O(n^2)\) 个终点,这是不划算的,不如弄 \(O(n)\) 个起点和 \(O(n)\) 个终点。
具体地,分离变量,就是所有 \((-a_i,-b_i)\) 走到 \((a_j,b_j)\) 的方案数,考虑 dp。
AGC002F
转化限制变成任意前缀白球的个数不小于其他球颜色的种数。
设 \(dp_{i,j}\) 表示填到第 \(i\) 个位置,可以填 \(j\) 种颜色。这样是很麻烦的,因为不确定某个颜色有没有填完。
那么我们要一种一种颜色填。我们不妨按颜色第一个出现的位置排序,按 \(1\sim n\) 标号,答案再乘上 \(n!\).
我们现在假设加入一种颜色,就要把 011111.... 插入,因为前面是合法的,所以这个也是随便插入的。
我们从 \(n\) 填到 \(1\),因为颜色顺序被钦定,第一个 1 要插到序列最前,那么 \(0\) 也要插到前面去。
所以设 \(dp_{i,j}\) 表示填了 \((n-i+1)\sim n\) 的颜色,当前最前面有 \(j\) 个 \(0\)。
\(dp_{i,j+1}=\sum_{k\ge j} dp_{i-1,k}\times C_{m\times(i-1)-j+1+(m-2)-1}^{m-2}\).
CF1615F
由于我们的操作是把 00 变 11,11 变 00,假设我们把奇数位全部取反,那么操作就变成了交换 01。
假设 \(s,t\) 已经确定,那么 1 的相对位置也是确定了的,贡献是 \(\sum |pos(s)_i-pos(t)_i|\)。
设 \(f_{i,j}\) 表示考虑了 \([1,i]\),当前 s 中 \(1\) 比 \(t\) 多 \(j\) 个的方案数,\(g_{i,j}\) 记录答案之和。
\(f_{i,j}\) 枚举下一位转移,然后 \(g_{i,j}\) 的话加上 \(f_{i,j}\times |j|\) 作为贡献,因为将有 \(j\) 个 \(1\) 经过 \((i,i+1)\) 的间隙。
CF906C
数据范围考虑状压,假设我们已知集合 \(s\) 是一个团,集合 \(t\) 也是一个团,我们如何合并这两个集合?
当集合 \(s\) 中有一个点, 可以连到 \(t\) 中的点时,可以合并这两个集合。
我们还注意到一点,就是点的操作先后顺序是不重要的。
设计 \(dp_s\) 表示当前 \(s\) 集合的点是一个团的最小代价,\(dp_{s\cup e_i}=dp_s+1\),\(e_i\) 表示 \(i\) 连接的点,\(i\in s\).
ARC171D
这个限制也就是对于有限制的 \((l,r)\) 来说,\(h_r\neq h_{l-1}\times B^{r-l}\),也就是 \(\frac{h_r}{B^r}\neq \frac{h_l}{B^l}\)。
我们现在要做的就是给 \(n\) 个 \(\frac{h_i}{B^i}\) 赋颜色,使得有限制的 \((l,r)\) 互不相同,而且颜色数不超过 \(p\).
我们考虑状压 dp,设 \(dp_s\) 表示集合 \(s\) 染色最少花多少个颜色,考虑一个一个颜色填,
即若 \(t\) 集合满足里面的点两两独立,\(dp_s=dp_{s-t}+1\)。
P4359 [CQOI2016] 伪光滑数
求解第 k 大问题考虑 A*,我们现在要做的就是如何枚举遍历所有情况,且不重复,不遗漏。
我们发现最大的伪光滑数是所有质因数都相同,我们现在要设计一种方案来遍历所有数。
设当前数的最大质因数幂次大于 \(1\),那么我们把这个质因数换掉小一点的质数,可以得到一个新的数。
而且我们这样做是可以不重不漏,答案就是第 \(k\) 个弹出队列的数(不会重复入队)。
具体地,我们先把所有 \(p^k\) 的数入队,这些数是独立的,然后从这些数出发,拓展新的数。
相当于我们钦定一个数是由其“最小的质因数换成最大的质因数后的这个数”拓展而来。
P4211 [LNOI2014] LCA
虽然这个题有经典分块解法,但是今天学习了新做法。
我们先差分询问,然后我们从 \(1\sim n\) 加入点,扫描线,用数据结构维护所有点当前的答案。
我们要求的是 lca 的深度,也就是到根节点的公共路径长度,所以我们可以转化为这样:
把 \(x\) 加入时,将根到 \(x\) 的路径的点全部 \(+1\),查询 \(z\) 时只需要查询根到 \(z\) 的路径和即可,树剖。
MX0717C
在所有长度为 \(k\),值域为 \([0,m]\) 的序列 \(A\) 中,求所有 \(A_i \otimes A_j(i<j)\) 加起来的值为 \(n\) 的序列个数。
\(k\le 18,m\le 10^{12},n\le10^{15}\)。
我们先考虑拆位,设第 \(i\) 位上 \(A\) 中有 \(c_i\) 个 \(1\),那么 \(n=\sum 2^i\times c_i(n-c_i)\)。
注意到 \(c_i(n-c_i)\le 81\),且只有 \(9\) 种取值。
一个 \(2^i\) 能影响到的位置是有限的,那么拼成 \(n\) 的方案是少的,所以我们可以减少状态的个数。
从高往低填,设 \(f(i,m,k)\) 表示当前填到第 \(i\) 位,当前 \(n\) 还剩 \(m\),有 \(k\) 个 \(A_i\) 是有最高位限制。
转移枚举 \(c_i\),数位 dp 即可。