5.09
维护转移矩阵,线段树维护一段区间的矩阵乘法。
建 KMP 自动机,dpi,j,k 表示前 i 位,当前自动机上走到 j,已经匹配了 k 次的最小代价。当转移到终止节点时匹配次数加 1。
fi,0/1 表示从后往前走到 i,谁先手。发现 fi,0=−fi,1,改为一维。fi=min−fj+sumj−1−sumi−1。只与 (i,n] 的 min−fj+sumj−1 有关。mn=min(mn,2×sumi−1−mn)。
因为 ai≤106,改变 an 时 mn 的初值也只有 106 种,而中间 sumi−1 不变。连边 dfs 记录每个 mn 初值会变成什么。
5.10
容斥求出半径小于 r 的方案数。dpu,x,y 表示 u 的子树内,最深的未染色点的距离和最浅的染色点的距离。发现 x,y 只有一个有用。前后缀和优化,状态数 O(dep)<O(siz)。
用相邻两个球之间的距离来描述一个状态,鞅与停时定理。
1=n1∑f(ai)+f(aimodn+1)−f(ai−1)−f(aimodn+1−1)
差分 g(x)=f(xmodn+1)−f(x)。
n∑g(ai−1)−g(ai)
令 g(x)−g(x−1)=mnx,g(0)=f(0)=0,g(x)=−mn(2x+1),f(x)=−mn(3x+1)。终止势能为 f(m)。
O(nn) 预处理出每个数的所有因数,记为集合 pi。显然题目要求计数 u∣A,v∣B,w∣C。容斥,大力分讨。可以用 bitset 维护交集。如果把分解因数写成先分解质因数再 dfs 求因数,复杂度 O(n),常数约为 400。
5.12
状压每一行,记录每种状态在 m 列上出现的次数和最小代价,fwt。ansi⊕j=∑numi×valj。
加一维记录集合元素个数,fpopcount(i),i=ai。先将每一维 or 卷积,再 O(n2) 将外层加法卷积。复杂度 O(n22n)。
无法子集卷积。因为对 4 取模,可以将 ai 乘 4popcount(i),然后进行不取模 or 卷积。如果 ai×bj→ck 且 i\text{&} j\neq 0,popcount(i)+popcount(j)>popcount(k)。最后 ci 除 4popcount(i) 再对 4 取模。
枚举最大值的位置,左边有 a−1 个最大值,右边有 b−1 个。分治NTT求 ∏(x+i)。
5.13
maxli≤L≤minvi≤maxvi≤R≤minri。矩形的交,扫描线。
5.14
容斥。存在 ai∈[x,x+k−1] 的方案数等于 minai≤x+k−1 的方案数减 maxai<x 的方案数。当确定了一个序列的最小值和差分数组就可以确定一个序列。前半部分方案数为 (x+k)×(2k+1)n−1。后半部分矩阵快速幂 O(x3logn)。
5.15
观察发现每个项目只与程序员数量和最小值有关,所以每个项目对应能力值连续的程序员最优。状压项目数。设 dpi,s 为前 i 个程序员匹配的项目状态为 s 是否可行,无法接受。交换维度,改为 dps 表示状态 s 能与前缀 [1,i] 匹配的最小 i。
全选不一定优。预处理 fi,s 表示第 i 个项目从 j 开始匹配程序员,最少要匹配到哪里。
5.17
j 贡献到 i 满足 xj<xi,yi×b−xi×a>yj×b−xj×a,yi×d−xi×c<yj×d−xj×c。发现第一个限制无用,随便维护。
5.20
异或差分后 2k 个关键位置,状压。u,v 最短路等于同时删 u,v 的代价。
dpi,j,k 表示分了前 i 人,j 组没封闭,代价为 k。按权值从小到大加入,每个人代价是所有没封闭的组的数量乘相邻两个权值的差。
5.21
点分治,记录当前子树到分治中心的权值和和换车次数。将新子树的答案合并时分类讨论分治中心到子树祖先 u→v 的颜色。树状数组维护前缀和。
向距离为 d 的点连边,为二分图。写为 (2ka,2kb),a×bmod4=1/2。在两个 4n2 个点的图上分别二分图染色,一定存在 n2 个在两张图上都同色的点。
树剖,对每个点维护当 u 为 0/1 时 u 子树内的最大连通块大小。还需要支持询问 u 到根第一个与 u 异色的点的位置,线段树上维护区间从右往左第一个 0/1 的位置。
5.22
每次选择只被覆盖一次的边删掉。树剖,线段树维护覆盖次数的最小值和位置,以及用异或维护覆盖这条边的红边编号。
按二进制拆位贪心,树剖维护从左右进入 0/1 出来的值。压位用位运算一起做。
等价于只存在大小为偶数的连通块。按权值排序加边,维护奇连通块的个数。
线段树分治,每条边都有一个影响范围。从右往左分治,每次右移加边的位置。