1.08
求每个询问串的所有循环同构在主串中出现的次数总和。
向后遍历可做,现在需要删掉开头。删除开头 l l l 减 1 1 1 ,如果 l = l e n l n k p l=len_{lnk_p} l = l e n l n k p ,那 p p p 就不能再在这个节点,p = l n k p p=lnk_p p = l n k p 。
1.09
子串 s [ a . . . b ] s[a...b] s [ a . . . b ] 的所有子串和 s [ c . . . d ] s[c...d] s [ c . . . d ] 的最长公共前缀的长度的最大值。
二分答案 m i d mid m i d ,询问 s [ c . . . c + m i d − 1 ] s[c...c+mid-1] s [ c . . . c + m i d − 1 ] 是否在 s [ a . . . b ] s[a...b] s [ a . . . b ] 中出现。设节点 p p p 表示 s [ c , c + m i d − 1 ] s[c,c+mid-1] s [ c , c + m i d − 1 ] ,问 p p p 的 endpos 是否在 [ a + m i d − 1 , b ] [a+mid-1,b] [ a + m i d − 1 , b ] 中有元素。
记录 p p p 表示 s [ 1... i ] s[1...i] s [ 1 . . . i ] ,倍增 parent tree 跳到 l e n p ≤ m i d len_p\leq mid l e n p ≤ m i d 。动态开点线段树合并 endpos 集合。
1.10
因为是对偶数位操作,将每两位和为一位。令 00 00 0 0 为 0 0 0 , 01 01 0 1 为 1 1 1 , 10 10 1 0 为 2 2 2 , 11 11 1 1 为 3 3 3 。如果有解,则 s u m a 0 = s u m b 0 , s u m a 3 = s u m b 3 , s u m a 1 + s u m a 2 = s u m b 1 + s u m b 2 suma0=sumb0,suma3=sumb3,suma1+suma2=sumb1+sumb2 s u m a 0 = s u m b 0 , s u m a 3 = s u m b 3 , s u m a 1 + s u m a 2 = s u m b 1 + s u m b 2 。
考虑从一个大问题转换为小问题。要找到一种方法使得在不改变其他结构的同时移动 a i a_i a i 。操作 2 × i − 2 2\times i-2 2 × i − 2 和 2 × i 2\times i 2 × i 可以实现两步将 a i a_i a i 换到 a 1 a_1 a 1 ,a 1... i − 1 a_{1...{i-1}} a 1 . . . i − 1 不改变结构的移到 a 2... i a_{2...i} a 2 . . . i 。
所以从后向前,设当前维护到 a i a_i a i ,此时 a 1... i − 1 a_{1...{i-1}} a 1 . . . i − 1 分别等于 b n − i + 2 . . . n b_{{n-i+2}...n} b n − i + 2 . . . n 。找到 a j = b n − i + 1 a_j=b_{n-i+1} a j = b n − i + 1 且 i ≤ j i\leq j i ≤ j ,执行上面操作即可。共 N N N 次操作。
现在问题是,s u m a 1 ≠ s u m b 1 suma1\neq sumb1 s u m a 1 = s u m b 1 ,我们要反转一次使 s u m a 1 = s u m b 1 suma1=sumb1 s u m a 1 = s u m b 1 。
我们可以找到 a a a 中某个前缀,使得 s u m a 1 − s u m a 1 i + s u m a 2 i = s u m b 1 suma1-suma1_i+suma2_i=sumb1 s u m a 1 − s u m a 1 i + s u m a 2 i = s u m b 1 ,翻转这个前缀。否则一定有 b b b 的某个前缀,使得 s u m b 1 − s u m b 1 i + s u m b 2 i = s u m a 1 sumb1-sumb1_i+sumb2_i=suma1 s u m b 1 − s u m b 1 i + s u m b 2 i = s u m a 1 。这时翻转 b b b 的这个前缀得到 b ′ b' b ′ ,把 a a a 做成 b ′ b' b ′ 再翻转这个前缀。
转换题意。对于 s i = s i + 1 s_i=s_{i+1} s i = s i + 1 的 i i i ,加入 a a a ,a a a 长为 m m m 。
发现可行的 s s s 上操作对应 a a a 上:
a a a 上删 a i , a i + 1 a_i,a_{i+1} a i , a i + 1 ,其中 a i ≠ a i + 1 a_i\neq a_{i+1} a i = a i + 1 ,s s s 上删 s [ a i + 1 , a i + 1 ] s[a_i+1,a_{i+1}] s [ a i + 1 , a i + 1 ] ,形如 b...[bca]...a。
a a a 上删 a i a_i a i ,其中 a i ≠ a i + 1 a_i\neq a_{i+1} a i = a i + 1 ,s s s 上删 a [ 1 , a i ] a[1,a_i] a [ 1 , a i ] ,形如 [bca]...a。
显然优先操作一,答案与 a a a 中出现次数最大的 p p p 有关,设为 t p t_p t p 。
从左到右操作,可以不用线段树,记录已删除量 d e l del d e l 。处理细节。
结束后栈不空,用操作二一个一个做。可能忽略 s [ a m + 1 , n ] s[a_m+1,n] s [ a m + 1 , n ] ,再用一次操作全部做完。
先求出可行的最大最小答案。
一条边将树分为 s i z A sizA s i z A 和 s i z B sizB s i z B ,能贡献最大为 m i n ( s i z A , s i z B ) min(sizA,sizB) m i n ( s i z A , s i z B ) ,最小为 s i z A m o d 2 sizA\bmod 2 s i z A m o d 2 。最大时,A , B A,B A , B 间两两连边,最小时,A , B A,B A , B 内部互相连,多出 s i z A m o d 2 sizA \bmod 2 s i z A m o d 2 。
拆开 m i n ( s i z A , s i z B ) min(sizA,sizB) m i n ( s i z A , s i z B ) ,可以取重心为根,最大贡献为向下的 s i z siz s i z 。最大时所有路径跨过根。因为重心子树大小最大小于 n 2 \frac{n}{2} 2 n ,构造取 dfn 序,d f n i dfn_i d f n i 与 d f n i + n 2 dfn_{i+\frac{n}{2}} d f n i + 2 n 连边即可。
最大时点的贡献是到根的距离。取点 u , v u,v u , v ,lca 为 t p tp t p 。本来 u , v u,v u , v 各自的贡献是 d e p u + d e p v dep_u+dep_v d e p u + d e p v ,连 u , v u,v u , v 后,贡献为 d e p u + d e p v − 2 × d e p t p dep_u+dep_v-2\times dep_{tp} d e p u + d e p v − 2 × d e p t p ,变化量模 2 2 2 为 0 0 0 。
从 m x a n s mxans m x a n s 变化为 m m m 。每次取出最大的 d e p t p dep_{tp} d e p t p 的 u , v u,v u , v 改为互相连,然后删掉。要保持重心结构,所以从最大 s i z siz s i z 中选。最后当 d e p t p > m x a n s − m dep_{tp}>mxans-m d e p t p > m x a n s − m ,因为 d e p t p dep_{tp} d e p t p 从最大往小,沿树向上一定找得到符合条件的。最后对没删掉的节点跑最大的构造。
1.11
q q q 次查询区间 01 背包,值域 t t t 。n ≤ 4 × 1 0 4 , q ≤ 2 × 1 0 5 , t ≤ 200 n\leq 4\times 10^4,q\leq 2\times 10^5,t\leq 200 n ≤ 4 × 1 0 4 , q ≤ 2 × 1 0 5 , t ≤ 2 0 0 。
可以 O ( t ) O(t) O ( t ) 合并背包 f f f 和 g g g 求出单个 d p dp d p 值。d p s = m a x i = 0 s f i + g s − i dp_s=max_{i=0}^{s}f_i+g_{s-i} d p s = m a x i = 0 s f i + g s − i 。
猫树分治:选取所有询问都包含的某个位置,分别向左右预处理。对于询问的回答,只需要在左端点取信息,在右端点取信息,再合并即可。
分治 S ( l , r , q l , q r ) S(l,r,ql,qr) S ( l , r , q l , q r ) 表示处理 [ l , r ] [l,r] [ l , r ] 的物品和 [ q l , q r ] [ql,qr] [ q l , q r ] 的询问。取 m i d = l + r 2 mid=\frac{l+r}{2} m i d = 2 l + r ,向左右背包。遍历 [ q l , q r ] [ql,qr] [ q l , q r ] 的询问,如果在左右就下放,否则合并算出答案。
复杂度 O ( n t log n + q t ) O(nt\log n+qt) O ( n t log n + q t ) 。
P5546 做区间询问。
选 s s s 作为文本串对其他所以 t t t 建的 SAM 匹配。复杂度 O ( ∣ s ∣ n ) O(|s|n) O ( ∣ s ∣ n ) ,∑ ∣ s ∣ \sum |s| ∑ ∣ s ∣ 为定值,∣ s ∣ |s| ∣ s ∣ 越小越好。
猫树分治 S ( l , r , q l , q r ) S(l,r,ql,qr) S ( l , r , q l , q r ) ,选最小的 s k s_k s k 处理跨过 k k k 的询问。s k s_k s k 过长复杂度退化,不能取中点分治。
取阈值 l i m lim l i m ,长度小于 l i m lim l i m 的为短串,在短串中取中心。如果没有短串,l i m = l i m × 2 lim=lim\times 2 l i m = l i m × 2 。对于 l i m lim l i m ,最多分治 log n \log n log n 次,区间大小 ∑ l e n l i m \frac{\sum len}{lim} l i m ∑ l e n ,匹配串 s s s 长 l i m lim l i m 。共 log ∑ l e n \log {\sum len} log ∑ l e n 种 l i m lim l i m ,复杂度 O ( ∑ l e n + m ) log n log l e n O(\sum len+m)\log n\log len O ( ∑ l e n + m ) log n log l e n 。
开一个大数组,然后用指针标记位置。
平面图最小割与对偶图最短路等价。
有向图欧拉回路当且仅当每个点入度等于出度。给无向边定向。先随便定向,记 d u = o u t u − i n u 2 d_u=\frac{out_u-in_u}{2} d u = 2 o u t u − i n u 。改变方向时 d u − 1 , d v + 1 d_u-1,d_v+1 d u − 1 , d v + 1 ,看作流量变化,连 ( u , v , 1 ) (u,v,1) ( u , v , 1 ) 。d u > 0 d_u>0 d u > 0 的连 S S S ,d u < 0 d_u<0 d u < 0 的连 T T T 。跑网络流看是否满流。
最大流等于最小割。k k k 条特殊边割或不割 2 k 2^k 2 k 个状态。对于一个状态,先不管特殊边边权,割掉要割的特殊边,跑最小割,在加上要割的特殊边边权,对所有状态取 min 即为答案。
当特殊边边权为 0 0 0 ,一定被割;边权为 m a x w = 25 maxw=25 m a x w = 2 5 ,一定不割。
从全不割到全割的转移。在旧状态的残余网络上改边权再跑即可,d p s = d p t + f l o w dp_s=dp_{t}+flow d p s = d p t + f l o w 。记录 2 k 2^k 2 k 个网络和当前状态的答案。
dinic 常数大,残余网络上用 FF,不过跟复杂度无关。
1.12
长度为 n n n 的数列,支持:单点修改,区间询问至多选 k k k 个的不交子段和的最大值。
连 ( s , i , 1 , 0 ) , ( i , i + 1 , 1 , a i ) , ( i , t , 1 , 0 ) (s,i,1,0),(i,i+1,1,a_i),(i,t,1,0) ( s , i , 1 , 0 ) , ( i , i + 1 , 1 , a i ) , ( i , t , 1 , 0 ) ,s − > i − > j − > t s->i->j->t s − > i − > j − > t 表示选 [ i , j ) [i,j) [ i , j ) 。要求至多 k k k 流的最大费用。
参考网络流反边,相当于每次取最大子段,再反转,重复 k k k 次。线段树维护从左、右开始最大值和位置,区间最大值和位置,以及反过来最小值。用栈记录翻过的位置,最后翻回来。
网络流。同 P2762 太空飞行计划问题 建图方式,将物品与 s s s 连 ( s , i , v i ) (s,i,v_i) ( s , i , v i ) ,警察与 t t t 连 ( j + n , t , v j ) (j+n,t,v_j) ( j + n , t , v j ) ,警察与对应的物品连 ( i , j + n , i n f ) (i,j+n,inf) ( i , j + n , i n f ) ,答案为所有物品的收益和减最小割。n , m ≤ 1 0 5 n,m\leq 10^5 n , m ≤ 1 0 5 ,显然跑不了网络流。考虑模拟最大流。
首先要描述警察 j j j 与物品 i i i 的关系。要满足:
∣ x i − x j y i − y j ∣ ≤ w h \mid \frac{x_i-x_j}{y_i-y_j} \mid \leq \frac{w}{h}
∣ y i − y j x i − x j ∣ ≤ h w
x j × h − y j × w ≤ x i × h − y i × w x_j\times h-y_j\times w\leq x_i\times h-y_i\times w
x j × h − y j × w ≤ x i × h − y i × w
x j × h + y j × w ≥ x i × h + y i × w x_j\times h+y_j\times w\geq x_i\times h+y_i\times w
x j × h + y j × w ≥ x i × h + y i × w
令 x = x × h + y × w , y = x × h − y × w x=x\times h+y\times w,y=x\times h-y\times w x = x × h + y × w , y = x × h − y × w 。得到 x i ≤ x j , y i ≥ y j x_i\leq x_j,y_i\geq y_j x i ≤ x j , y i ≥ y j ,能很好描述。
将物品和警察放在一起从左到右,从上到下考虑,自然满足 x i ≤ x j x_i\leq x_j x i ≤ x j 。贪心,一个警察 j j j 的流优先从 y i ≥ y j y_i\geq y_j y i ≥ y j 且 y i y_i y i 最小处流过来,因为更大的 y i y_i y i 能满足更多人限制。用 set 储存物品,警察处 lower_bound 查找。
划分序列,代价为 x x x 加区间逆序对数,求最小代价。
d p i = max d p j + c a l c ( j + 1 , i ) dp_i=\max dp_j+calc(j+1,i) d p i = max d p j + c a l c ( j + 1 , i ) ,满足决策单调性,单层转移。问题在求区间逆序对数。考虑类似莫队,要求左右两端移动次数不能过大。分治 s o v l e ( l , r , q l , q r ) sovle(l,r,ql,qr) s o v l e ( l , r , q l , q r ) 中 l , r l,r l , r 移动 O ( n log n ) O(n\log n) O ( n log n ) 次,可以接受。cdq 分治分层做 sovle,维护树状数组。复杂度 O ( n log 3 n ) O(n\log^3 n) O ( n log 3 n ) 。
1.13
一个序列的 p p p 即每次删除一个包含 [ 1 , c ] [1,c] [ 1 , c ] 的前缀能删的次数。
设 g l , r g_{l,r} g l , r 表示 [ l , r ] [l,r] [ l , r ] 中强制选 a r a_r a r 并正好选出 [ 1 , c ] [1,c] [ 1 , c ] 的子序列数。g l , r = ∏ i ≠ a r t i − 1 g_{l,r}=\prod_{i\neq a_r}t_i-1 g l , r = ∏ i = a r t i − 1 。设 f i , j f_{i,j} f i , j 表示以 j j j 结尾并强制选 j j j 的答案为 i i i 的数量。f i , j = ∑ f i − 1 , k + g k + 1 , j f_{i,j}=\sum f_{i-1,k}+g_{k+1,j} f i , j = ∑ f i − 1 , k + g k + 1 , j 。因为答案小于 n m \frac{n}{m} m n ,复杂度 O ( n 3 m ) O(\frac{n^3}{m}) O ( m n 3 ) 。答案为 i i i 后乱选,设 a n s i ans_i a n s i 表示答案至少为 i i i 的数量。a n s i = f i , j × 2 n − j ans_i=f_{i,j}\times 2^{n-j} a n s i = f i , j × 2 n − j ,差分得答案。
求 s [ p l , p r ] s[pl,pr] s [ p l , p r ] 在 T [ l , r ] T[l,r] T [ l , r ] 中哪个串出现次数最多。
对 t t t 建广义 SAM,s s s 在上面跑匹配。如果 s [ p l , p r ] s[pl,pr] s [ p l , p r ] 在 t t t 中出现,倍增找到 s [ p l , p r ] s[pl,pr] s [ p l , p r ] 对应的节点。每个节点动态开点线段树,下标为 t t t 的编号,记录出现次数最大值和下标,线段树合并。
1.14
求子序列最长长度使 lis 比原序列 lis 小。
连边 ( i , i ′ , 1 ) (i,i',1) ( i , i ′ , 1 ) ,( S , i , i n f ) , f i = 1 (S,i,inf),f_i=1 ( S , i , i n f ) , f i = 1 ,( i ′ , T , i n f ) , f i = m x (i',T,inf),f_i=mx ( i ′ , T , i n f ) , f i = m x ,( i ′ , j , i n f ) , f i + 1 = f j , i < j , a i < a j (i',j,inf),f_i+1=f_j,i<j,a_i<a_j ( i ′ , j , i n f ) , f i + 1 = f j , i < j , a i < a j 跑最小割。模拟最大流。分层,对于点 u , v , f u = f v = i , u < v , a u > a v u,v,f_u=f_v=i,u<v,a_u>a_v u , v , f u = f v = i , u < v , a u > a v 。u u u 去到 i + 1 i+1 i + 1 层的区间 [ l u , r u ] [l_u,r_u] [ l u , r u ] 满足 l u ≤ l v , r u ≤ r v l_u\leq l_v,r_u\leq r_v l u ≤ l v , r u ≤ r v 。对于一个流,优先向 l u l_u l u 去,因此不需要退流。记录 v i s u vis_u v i s u 表示是否走过,t o u to_u t o u 指向下一个 v i s u = 0 vis_u=0 v i s u = 0 的点。O ( n ) O(n) O ( n ) 模拟。
1.15
树上节点 i i i 有 a i a_i a i 个石子,每次选任意个移到 k k k 级祖先,不能动输,问以每个点为根先手胜负。
d e p u dep_u d e p u 模 k k k 相等的分别考虑 SG 值。当 ⌊ d e p u k ⌋ \lfloor \frac{dep_u}{k} \rfloor ⌊ k d e p u ⌋ 为偶数时,u u u 没意义。因为先手移偶数位后手可以移回奇数位。设 d p u , j , 0 / 1 dp_{u,j,0/1} d p u , j , 0 / 1 表示 d e p u m o d k = j , ⌊ d e p u k ⌋ m o d 2 = 0 / 1 dep_u \bmod k=j,\lfloor \frac{dep_u}{k} \rfloor \bmod 2=0/1 d e p u m o d k = j , ⌊ k d e p u ⌋ m o d 2 = 0 / 1 时的 SG 值。换根 dp。
初始全为 0 0 0 ,模 k k k 意义下最少多少次区间加 1 1 1 得到 a a a 数组。
如果不模 k k k ,差分得 b b b ,a n s = ∑ [ b i > 0 ] b i ans=\sum [b_i>0]b_i a n s = ∑ [ b i > 0 ] b i 。预先对 a a a 区间加 k k k 代替取模,b u + k , b v + 1 − k b_u+k,b_{v+1}-k b u + k , b v + 1 − k ,最小化 a n s ans a n s 。反悔贪心,取出最小的 b j < 0 b_j<0 b j < 0 和当前 b i > 0 b_i>0 b i > 0 做区间加后 b j > 0 , b i < 0 b_j>0,b_i<0 b j > 0 , b i < 0 ,把 b i b_i b i 入队。
中位数相关,考虑 a j > a i a_j>a_i a j > a i 的 j j j 设为 1 1 1 ,a j < a i a_j<a_i a j < a i 的 j j j 设为 − 1 -1 − 1 ,做前缀和。a j = a i a_j=a_i a j = a i 时可以任意排列。
a i > a m i d a_i>a_{mid} a i > a m i d ,a j = a i a_j=a_i a j = a i 的 j j j 放在 i i i 前,设为 − 1 -1 − 1 。a n s = max ∑ [ a j ≤ a i ] − ⌈ l + r 2 ⌉ = − min ( s u m r − s u m l − 1 ) − 1 2 ans=\max \sum [a_j\leq a_i] -\lceil \frac{l+r}{2} \rceil=\frac{-\min (sum_r-sum_{l-1})-1}{2} a n s = max ∑ [ a j ≤ a i ] − ⌈ 2 l + r ⌉ = 2 − min ( s u m r − s u m l − 1 ) − 1 。
否则,a j = a i a_j=a_i a j = a i 的 j j j 放在 i i i 后,设为 1 1 1 。a n s = max ∑ [ a j ≥ a i ] − ⌈ l + r 2 ⌉ = max ( s u m r − s u m l − 1 ) 2 ans=\max \sum [a_j\geq a_i] -\lceil \frac{l+r}{2} \rceil=\frac{\max (sum_r-sum_{l-1})}{2} a n s = max ∑ [ a j ≥ a i ] − ⌈ 2 l + r ⌉ = 2 max ( s u m r − s u m l − 1 ) 。
要动态维护 max ( s u m r − s u m l − 1 ) \max (sum_r-sum_{l-1}) max ( s u m r − s u m l − 1 ) 。可以按 a i a_i a i 从小往大加入。初始时 s u m i = i sum_i=i s u m i = i ,当 a i a_i a i 改为 − 1 -1 − 1 时,线段树维护区间 [ i , n ] [i,n] [ i , n ] 减 2 2 2 。max ( s u m r − s u m l − 1 ) = max j = i n s u m j − min j = 1 i s u m j − 1 \max (sum_r-sum_{l-1})=\max_{j=i}^{n}sum_j-\min_{j=1}^{i}sum_{j-1} max ( s u m r − s u m l − 1 ) = max j = i n s u m j − min j = 1 i s u m j − 1 。
求恰好满足一个条件中的 ( u , v ) (u,v) ( u , v ) 个数:u u u 是 u − > v u->v u − > v 编号最小的点;v v v 是 u − > v u->v u − > v 编号最大的点。
容斥,a n s = ∣ A ∣ + ∣ B ∣ − 2 ∣ C ∣ ans=\mid A\mid+\mid B\mid-2\mid C\mid a n s = ∣ A ∣ + ∣ B ∣ − 2 ∣ C ∣ 。建大根、小根重构树,∣ A ∣ = ∑ s i z m x u \mid A\mid=\sum sizmx_u ∣ A ∣ = ∑ s i z m x u 。C C C 为在两棵树都有祖先关系的点对。枚举一边,树状数组维护从根到当前节点在另一颗树上的 dfn 序,区间查询,单点修改。
t i = s [ i , n ] t_i=s[i,n] t i = s [ i , n ] 。求 ∑ i < j l e n t i + l e n t j − 2 × l c p ( t i , t j ) \sum_{i<j}len_{t_i}+len_{t_j}-2\times lcp(t_i,t_j) ∑ i < j l e n t i + l e n t j − 2 × l c p ( t i , t j ) 。
a n s = n × ( n − 1 ) × ( n + 1 ) 2 − 2 × ∑ i < j l c p ( t i , t j ) ans=\frac{n\times (n-1)\times (n+1)}{2}-2\times \sum_{i<j} lcp(t_i,t_j) a n s = 2 n × ( n − 1 ) × ( n + 1 ) − 2 × ∑ i < j l c p ( t i , t j ) 。lcp 看作公共前缀数量。记 s i z u siz_u s i z u 表示节点 endpos 集合大小,对每个节点计算贡献,有 n u m u = l e n u − l e n f a u num_u=len_u-len_{fa_u} n u m u = l e n u − l e n f a u 个串,每个串出现在 s i z u siz_u s i z u 个后缀的前缀中,贡献 n u m u × s i z u × ( s i z u − 1 ) 2 num_u\times \frac{siz_u\times (siz_u-1)}{2} n u m u × 2 s i z u × ( s i z u − 1 ) 。
翻转建 SAM,lcp 转换为最长公共后缀,即 parent tree 上的 lca 的 len。记录子树内最大、次大、最小、次小。
极小的 mex 区间有 O ( n ) O(n) O ( n ) 个。枚举 i i i 维护所有极小 [ l , r ] , m e x l , r = i [l,r],mex_{l,r}=i [ l , r ] , m e x l , r = i ,不断向左右一边拓展至最近的 a i a_i a i ,得到 m e x l ′ , r ′ = c a l c ( l ′ , r ′ ) > i mex_{l',r'}=calc(l',r')>i m e x l ′ , r ′ = c a l c ( l ′ , r ′ ) > i 的一个区间,所有这些区间包含所有极小区间,每次转移前删去非极小区间。计算区间 mex:可持久化线段树,[ 1 , n ] [1,n] [ 1 , n ] 为版本,维护每个值最后出现的位置,二分。已知有极小区间 [ l , r ] , m e x l , r = x [l,r],mex_{l,r}=x [ l , r ] , m e x l , r = x ,找到左右的 L , R , a L − 1 = a R + 1 = x L,R,a_{L-1}=a_{R+1}=x L , R , a L − 1 = a R + 1 = x ,则 m e x l ′ , r ′ = x , L ≤ l ′ ≤ l , r ≤ r ′ ≤ R mex_{l',r'}=x,L\leq l'\leq l,r\leq r'\leq R m e x l ′ , r ′ = x , L ≤ l ′ ≤ l , r ≤ r ′ ≤ R 。所有 r − l + 1 , R − L + 1 r-l+1,R-L+1 r − l + 1 , R − L + 1 中的 l e n len l e n 存在 m e x = x mex=x m e x = x ,记录加入和删除位置,用 set 扫一遍。
1.16
观察发现,第 i i i 行 a i , j 1 = … = a i , j n u m = 1 , ( j 1 < … < j n u m ) a_{i,j_1}=\ldots =a_{i,j_{num}}=1,(j_1<\ldots <j_{num}) a i , j 1 = … = a i , j n u m = 1 , ( j 1 < … < j n u m ) ,则第 i i , ( i i > i ) ii,(ii>i) i i , ( i i > i ) 行能取 1 1 1 的位置是 [ 1 , j 1 − 1 ] [1,j_1-1] [ 1 , j 1 − 1 ] 和 j j j 的一个前缀。
但可以空一些行和列,考虑将所有有 1 1 1 的行和列压起来。设 d p i , j , k dp_{i,j,k} d p i , j , k 表示前 i i i 行,有 j j j 个列有过 1 1 1 ,上一行有 k k k 个 1 1 1 ,强制连续选。首先可以取一个前缀,d p i , j , k ′ = ∑ l = k j d p i − 1 , j , l dp'_{i,j,k}=\sum_{l=k}^j dp_{i-1,j,l} d p i , j , k ′ = ∑ l = k j d p i − 1 , j , l ,后缀和维护。其次可以向前任意取,但强制连续选,枚举选 l l l 个,d p i , j , k = ∑ l = 0 k d p i , j − l , k − l ′ dp_{i,j,k}=\sum_{l=0}^k dp'_{i,j-l,k-l} d p i , j , k = ∑ l = 0 k d p i , j − l , k − l ′ ,维护一个斜线的前缀和。a n s = ∑ ( n i ) × ( m j ) × d p i , j , k ans=\sum \binom{n}{i}\times \binom{m}{j}\times dp_{i,j,k} a n s = ∑ ( i n ) × ( j m ) × d p i , j , k 。再加上全取 0 0 0 的情况。
注意取模优化和枚举时 1 2 \frac{1}{2} 2 1 的常数!
1.18
分层,只有层间和向下层的边。设当前层 m m m 个点,x x x 个二度,y y y 个三度,层间连 z z z 条。
向下层:( x + 2 y − z ) ! (x+2y-z)! ( x + 2 y − z ) !
层间:( x + 2 y ) ! ( x + 2 y − 2 z ) ! × 2 z × z ! \frac{(x+2y)!}{(x+2y-2z)!\times 2^z\times z!} ( x + 2 y − 2 z ) ! × 2 z × z ! ( x + 2 y ) ! ,将二度点当两个点,再出去对的相对顺序。
容斥掉 p p p 个重边、q q q 个自环,设 s = 2 p + q s=2p+q s = 2 p + q :( − 1 ) p + q × y ! ( y − s ) ! × p ! × q ! × ( x + 2 y − 2 s ) ! ( x + 2 y − 2 z ) ! × 2 x − s × ( z − s ) ! \frac{(-1)^{p+q}\times y!}{(y-s)!\times p!\times q!}\times\frac{(x+2y-2s)!}{(x+2y-2z)!\times 2^{x-s}\times (z-s)!} ( y − s ) ! × p ! × q ! ( − 1 ) p + q × y ! × ( x + 2 y − 2 z ) ! × 2 x − s × ( z − s ) ! ( x + 2 y − 2 s ) !
维护一个可行答案集合,取出两个询问,将不可行的扔掉。要保证每次询问不能问到粉边,要求每个粉连通块只有一个点在集合中。强行当成 DAG,如果不行再将联通块其他点加入。
构造。将边拆为 u u u 和 v + n v+n v + n ,二分图,如果能使每个点极差不超过 1 1 1 ,合并后不超过 2 2 2 。设点 u u u 度数为 a k + b ak+b a k + b ,拆为 a + 1 a+1 a + 1 个点。边染色使所有出边颜色不同。同 CF600F 。
1.19
∅ \emptyset ∅ 必胜。{ 1 } , { 2 } \{1\},\{2\} { 1 } , { 2 } 必败。
否则 ∃ x m o d 2 = 1 \exists x\bmod 2=1 ∃ x m o d 2 = 1 模 2 2 2 必胜。
否则 ∃ x m o d 4 = 2 \exists x\bmod 4=2 ∃ x m o d 4 = 2 模 4 4 4 必胜。
否则模 3 3 3 后如果 S = { 1 } S=\{1\} S = { 1 } 或 { 2 } \{2\} { 2 } 必胜。
否则 S = { 4 , 8 } S=\{4,8\} S = { 4 , 8 } 必败,否则模 12 12 1 2 得 { 4 , 8 } \{4,8\} { 4 , 8 } 必胜。
如果 ∀ 12 ∣ x \forall 12\mid x ∀ 1 2 ∣ x ,难以分类讨论。有 ⌊ 200 12 ⌋ = 16 \lfloor \frac{200}{12} \rfloor=16 ⌊ 1 2 2 0 0 ⌋ = 1 6 ,状压计算出现次数和胜负。
圆方树。求出点双,对每个点双建方点,原图点是圆点,方点与对应的圆点连边。
当进入一个点双,一定能到点双中权值最小的点。方点权值为最小的圆点权值,multiset 维护删除,树剖维护路径最小值。
1.20
对于不互质的数,后手操作后先后顺序不变。对所有不互质的连边。要求定向后最大拓扑序最小。按权值从小到大 dfs 儿子连边,拓扑时用优先队列。
1.21
从长为 1 1 1 和 2 2 2 的回文串开始枚举左右出边 bfs,复杂度 O ( m 2 ) O(m^2) O ( m 2 ) 。减少无用的边。将 00 , 11 00,11 0 0 , 1 1 和 01 , 10 01,10 0 1 , 1 0 分开,形成若干连通块。如果连通块为二分图,两点间奇偶性相同,可以反复横跳,取生成树即可。不是二分图,连自环即可。边数将为 O ( n ) O(n) O ( n ) 。
1.22
枚举每个颜色 c c c ,枚举右端,线段树区间维护左端 min 和 max 是否符合条件。
树形 dp。设 d p u , i dp_{u,i} d p u , i 表示 u u u 子树内分 j j j 段的最大数量。难以记录 u u u 所在连通块状态。设 f u , i f_{u,i} f u , i 表示最大数量下 w i − b i w_i-b_i w i − b i 的值。背包 O ( n 2 ) O(n^2) O ( n 2 ) 。
1.23
是基环树。先考虑树。如果从一个点开始,定为根,a n s = ∑ s i z u ans=\sum siz_u a n s = ∑ s i z u 。换根 dp 即可。
把环找出来,考虑在环上点 u u u 的子树中开始染色的答案。染色的方式是大致是从子树的叶子开始向上。对 u u u 的每个非环上儿子做树的 dp。记 g u g_u g u 表示从环上进入子树向下染色的答案,d p u dp_u d p u 表示换根的、从子树内任意节点开始染色的方案。从环上 u u u 的非环上儿子 v v v 的子树开始的答案是 d p v + ∑ v ′ ≠ v g v ′ dp_v+\sum_{v'\neq v} g_{v'} d p v + ∑ v ′ = v g v ′ ,a n s u = ∑ g v + max ( d p v − g v ) ans_u=\sum g_v+\max (dp_v-g_v) a n s u = ∑ g v + max ( d p v − g v ) 。染完环上 u u u 的子树后,绕环染环上点。再从除 u u u 外的环上点向下染其他环上点的子树,答案为 ∑ g v \sum g_v ∑ g v 。
发现前后贡献固定,变动的是染环的顺序。染环是染一个区间,每次向左右拓展。每次染一个点,答案加上当前连通块大小,当前连通块大小减 s i z u siz_u s i z u 。贪心向小的染是错的,因为有后效性。记录 s i z siz s i z 的前缀和,区间 dp,O ( 1 ) O(1) O ( 1 ) 向左右转移,滚动即可。
1.24
a n s = ∑ ( X × 1 0 i + 47 … 7 ) ( X × 1 0 i + 74 … 4 ) ans=\sum(X\times 10^i+47\dots7)(X\times10^i+74\dots4)
a n s = ∑ ( X × 1 0 i + 4 7 … 7 ) ( X × 1 0 i + 7 4 … 4 )
维护 X X X 的数量、和、平方和。
对于平面图,V − E + F = 2 V-E+F=2 V − E + F = 2 ,顶点数、边数、平面数。每个面至少围 3 3 3 条边,每条边对应两个面,2 E ≥ 3 F 2E\geq3F 2 E ≥ 3 F ,E ≤ 3 V − 6 E\leq3V-6 E ≤ 3 V − 6 。平面图存在点度数小于等于 5 5 5 ,对偶图也是平面图存在点度数小于等于 5 5 5 ,平面图存在环小于等于 5 5 5 。判三、四元环。
根号分治,按度数、大小定向为 DAG。复杂度 O ( m m ) O(m\sqrt m) O ( m m ) 。
连成若干个环,k = l c m a i k=lcm a_i k = l c m a i 。要 ∑ a i ≤ n × m \sum a_i\leq n\times m ∑ a i ≤ n × m ,取 a i = p i c i a_i=p_i^{c_i} a i = p i c i 。构造交换相邻的方案。
1.28
cdq 分治拆成 [ l , m i d ] [l,mid] [ l , m i d ] 到 ( m i d , r ] (mid,r] ( m i d , r ] 的贡献。
对于一个区间计算答案可以用 dp 完成。以 m i d mid m i d 为交界合并左右的 dp 值。设 f i , 0 / 1 f_{i,0/1} f i , 0 / 1 表示区间 [ i , m i d ] [i,mid] [ i , m i d ] 或区间 ( m i d , i ] (mid,i] ( m i d , i ] ,是否选 m i d mid m i d 或 m i d + 1 mid+1 m i d + 1 的答案。记跨过 m i d mid m i d 的贡献为 w w w 。
w = ∑ i = l m i d ∑ j = m i d + 1 r a n s ( i , j ) w=\sum_{i=l}^{mid}\sum_{j=mid+1}^{r} ans(i,j)
w = i = l ∑ m i d j = m i d + 1 ∑ r a n s ( i , j )
记 g i = f i , 1 − f i , 0 g_i=f_{i,1}-f_{i,0} g i = f i , 1 − f i , 0 。
w = ∑ i = l m i d ∑ j = m i d + 1 r max ( g i + f i , 0 + f j , 0 , g j + f i , 0 + f j , 0 ) w=\sum_{i=l}^{mid}\sum_{j=mid+1}^{r} \max(g_i+f_{i,0}+f_{j,0},g_j+f_{i,0}+f_{j,0})
w = i = l ∑ m i d j = m i d + 1 ∑ r max ( g i + f i , 0 + f j , 0 , g j + f i , 0 + f j , 0 )
w = ∑ i = l m i d ∑ j = m i d + 1 r max ( g i , g j ) + ∑ i = l m i d f i , 0 × ( r − m i d ) + ∑ j = m i d + 1 r f j , 0 × ( m i d − l + 1 ) w=\sum_{i=l}^{mid}\sum_{j=mid+1}^{r} \max(g_i,g_j)+\sum_{i=l}^{mid}f_{i,0}\times (r-mid)+\sum_{j=mid+1}^r f_{j,0}\times (mid-l+1)
w = i = l ∑ m i d j = m i d + 1 ∑ r max ( g i , g j ) + i = l ∑ m i d f i , 0 × ( r − m i d ) + j = m i d + 1 ∑ r f j , 0 × ( m i d − l + 1 )
后面两个直接做,前面的对于每个 i i i 拆开 max 计算。
∑ j = m i d + 1 r max ( g i , g j ) = ∑ j = m i d + 1 r [ g i ≥ g j ] × g i + [ g i < g j ] × g j \sum_{j=mid+1}^{r} \max(g_i,g_j)=\sum_{j=mid+1}^{r}[g_i\geq g_j]\times g_i+[g_i<g_j]\times g_j
j = m i d + 1 ∑ r max ( g i , g j ) = j = m i d + 1 ∑ r [ g i ≥ g j ] × g i + [ g i < g j ] × g j
对 ( m i d , r ] (mid,r] ( m i d , r ] 的 g j g_j g j 排序,二分 g i g_i g i 的位置,记录 g j g_j g j 的后缀和即可。递归 [ l , m i d ] [l,mid] [ l , m i d ] 和 ( m i d , r ] (mid,r] ( m i d , r ] 解决。