std for 近期刷的题

1.CF592D Super M(2200)

O ( n ) \mathcal O(n) O(n) 暴力建虚树,答案即为 ( n − 1 ) × 2 − m x (n-1)\times 2-mx (n1)×2mx n n n 为虚树总点数, m x mx mx 为虚树直径),时间复杂度 O ( n ) \mathcal O(n) O(n)

2.CF601B Lipshitz Sequence(2100)

易证,最大值只会出现在相邻两个数之间,不会跨过数。由于要求区间子段的答案,那么肯定不能暴枚,考虑维护一个数在多少子段内可作为最大值,可单调栈 O ( n ) \mathcal O(n) O(n) 维护。时间复杂度 O ( q n ) \mathcal O(qn) O(qn)

3.CF601C Kleofáš and the n-thlon(2300)

f i , j f_{i,j} fi,j 表示前 i i i 项比赛中获得总分为 j j j 的期望人数。那么答案即为 1 + ∑ i = 1 s u m − 1 f n , i 1+\sum\limits_{i=1}^{sum-1}f_{n,i} 1+i=1sum1fn,i(其中 s u m sum sum 为所有 c i c_i ci 的总和)。转移方程显而易见: f i , j = ∑ k = 1 m f i − 1 , j − k ( k ≠ c i ) m − 1 f_{i,j}=\frac{\sum\limits_{k=1}^{m}f_{i-1,j-k}(k \ne c_i)}{m-1} fi,j=m1k=1mfi1,jk(k=ci)。转移时用前缀和优化。时间复杂度 O ( n m ) \mathcal O(nm) O(nm)

4.CF1338A Powered Addition(1500)

如果这一个数比前一个大,就这么留着显然是最优的。如果这一个数比前一个小,我们二进制计算它至少需要几轮操作才能比前一个更大,取最大值即可,时间复杂度 O ( n log ⁡ n ) \mathcal O(n \log n) O(nlogn)

5.CF1338B Edge Weight Assignment(1800)

考虑第一问,若树上所有叶子节点之间距离均为偶数,那么答案即为 1 1 1,否则可用如下方法分配:在 1 1 1 号点为根的情况下,我们把到根节点距离为奇数的叶子节点称为奇点,类似定义偶点。若奇点的距离为 2 k + 1 2k+1 2k+1,我们从上到下填入 2 k 2k 2k 3 3 3 和一个 1 1 1。若偶点的距离为 2 k 2k 2k,我们从上到下填入 2 k − 1 2k-1 2k1 3 3 3 和一个 2 2 2,易知这样是正确的,故只需要 3 3 3 种颜色。

考虑第二问,如果若干个叶子节点父亲相同,这些节点所连边的权值也必须相同,否则随便填,一定可以满足,算一下每个点叶子儿子个数即可。

时间复杂度 O ( n ) \mathcal O(n) O(n)

6.CF1338C Perfect Triples(2200)

找规律。

  1. a a a 的取值把序列分成了若干块,每一块内的 a a a 都是从 2 k 2^k 2k 2 k + 1 − 1 2^{k+1}-1 2k+11 的连续整数。
  2. 同一块内, b b b 的取值可以递归构造。每次将大块分成四小块,分别取第 1 , 3 , 4 , 2 1,3,4,2 1,3,4,2 小的值。
  3. 同一块内, c c c 的取值可以递归构造。每次将大块分成四小块,分别取第 1 , 4 , 2 , 3 1,4,2,3 1,4,2,3 小的值。

7.CF842E Nikita and game(2800)

由于多条直径间定有相交部分,那么维护 s 1 , s 2 s1,s2 s1,s2 分别表示相交部分左右的点。那么每次加点直径要么不变要么变大。如果不变,对应集合加点即可。如果变,清空对应集合,判断另一个集合的点,距离为新直径加入即可。易证复杂度正确。时间复杂度 O ( n log ⁡ n ) \mathcal O(n \log n) O(nlogn)

8.AT4754 [ABC126F] XOR Matching(1770)

简单构造。首先若 k ≥ 2 m k \ge 2^m k2m,无解。其次,由 0 ⊕ 1 ⊕ ⋯ ⊕ ( 2 m − 1 ) = 0 0⊕1⊕\cdots ⊕ (2^m-1)=0 01(2m1)=0 启发,按如下方法构造 ( 0 , 1 , 2 , ⋯   , 2 m − 1 ) ( 不 包 括   k ) (0,1,2,\cdots,2^m-1)(不包括 \ k) (0,1,2,,2m1)( k) k k k ( 0 , 1 , 2 , ⋯   , 2 m − 1 ) ( 不 包 括   k ) (0,1,2,\cdots,2^m-1)(不包括 \ k) (0,1,2,,2m1)( k) k k k。时间复杂度 O ( n ) \mathcal O(n) O(n)

9.AT3884 [ARC090D] Number of Digits(2891)

分类讨论。

观察到 S ≤ 1 0 8 S \leq 10^8 S108,那么当 l < 1 0 7 l < 10^7 l<107 时, r < = 23000000 r <= 23000000 r<=23000000,尺取即可。

l ≥ 1 0 7 l \ge 10^7 l107 时,有 f ( r ) − f ( l ) ≤ 1 f(r)-f(l) \leq 1 f(r)f(l)1,枚举区间长度 t t t,假设 t t t x x x 个数位 f ( l ) f(l) f(l) 的数和 y y y 个数位 f ( l ) + 1 f(l) + 1 f(l)+1 的数组成,于是有: { x + y = t f ( l ) × x + ( f ( l ) + 1 ) × y = S \begin{cases}x+y=t\\f(l)\times x+(f(l)+1)\times y=S\end{cases} {x+y=tf(l)×x+(f(l)+1)×y=S

整理得 f ( l ) × t = S f(l)\times t=S f(l)×t=S。然后枚举长度 t t t t ≤ ⌊ n 8 ⌋ t \leq \lfloor\frac{n}{8}\rfloor t8n),分类讨论 f ( r ) − f ( l ) f(r)-f(l) f(r)f(l) 的值即可。时间复杂度 O ( 可 过 ) \mathcal O(可过) O()

10.CF770C Online Courses In BSU(1500)

如果必修课程在环内,则无解,否则有解,tarjan 判环加拓扑排序模拟即可。时间复杂度 O ( m ) \mathcal O(m) O(m)

11.CF1421D Hexagons(1900)

暴力模拟到周围 6 6 6 点的最小花费,分类讨论即可。时间复杂度 O ( 1 ) \mathcal O(1) O(1)

12.CF1421E Swedish Heroes(2700)

考虑到所有合法的分配方案都满足一个简单的性质: 2 × p + q ≡ 1 ( m o d 3 ) 2 \times p+q \equiv 1 \pmod 3 2×p+q1(mod3)(其中 p p p- 的个数, q q q+ 的个数)和至少存在一对相邻且符号相同的数。数学归纳易证。

由此,设 f i , j , 0 / 1 , 0 / 1 f_{i,j,0/1,0/1} fi,j,0/1,0/1 表示考虑了前 i i i 个数, 2 × p + q ≡ j ( m o d 3 ) 2 \times p+q\equiv j \pmod 3 2×p+qj(mod3),第 i i i 个数的符号为 -+,否/是存在至少一对相邻且符号相同的数,的答案。

边界 f 1 , 2 , 0 , 0 = − a 1 f_{1,2,0,0}=-a_1 f1,2,0,0=a1 f 1 , 1 , 1 , 0 = a 1 f_{1,1,1,0}=a_1 f1,1,1,0=a1

转移方程:
f i + 1 , ( j + 2 ) ( m o d 3 ) , 0 , t ∣ ( k = = 0 ) ← f i , j , k , t − a i + 1 f i + 1 , ( j + 2 ) ( m o d 3 ) , 1 , t ∣ ( k = = 1 ) ← f i , j , k , t + a i + 1 f_{i+1,(j+2)\pmod 3,0,t|(k==0)} \leftarrow f_{i,j,k,t}-a_{i+1}\\ f_{i+1,(j+2)\pmod 3,1,t|(k==1)} \leftarrow f_{i,j,k,t}+a_{i+1} fi+1,(j+2)(mod3),0,t(k==0)fi,j,k,tai+1fi+1,(j+2)(mod3),1,t(k==1)fi,j,k,t+ai+1
时间复杂度 O ( n ) \mathcal O(n) O(n)

13.CF855E Salazar Slytherin’s Locket(2200)

数位 dp 板子。模板 可看这。

先差分,再记 f i , j , k f_{i,j,k} fi,j,k 表示在 i i i 进制下有 j j j 位,并且每个数字出现次数的奇偶性是 k k k 的数的个数。

转移方程: f i , j , k = ∑ m = 0 i − 1 f i , j − 1 , k ⊕ 2 m f_{i,j,k}=\sum\limits_{m=0}^{i - 1}f_{i,j-1,k⊕2^{m}} fi,j,k=m=0i1fi,j1,k2m

时间复杂度 O ( log ⁡ b ( r ) 2 b b 2 ) \mathcal O(\log_b(r)2^bb^2) O(logb(r)2bb2)

14.CF711C Coloring Trees(1700)

f i , j , k f_{i,j,k} fi,j,k 表示前 i i i 个点,第 i i i 个点染为 j j j,分成 k k k 段的最小花费。

转移方程:

  • i i i 个点已被染色: f i , c o l i , k = min ⁡ ( f i , c o l i , k , f i − 1 , l s t , k − ( l s t = = c o l i ? 0 : 1 ) ) f_{i,col_i,k}=\min(f_{i,col_i,k},f_{i-1,lst,k-(lst==col_i?0:1)}) fi,coli,k=min(fi,coli,k,fi1,lst,k(lst==coli?0:1))
  • i i i 个点未被染色: f i , j , k = min ⁡ ( f i , j , k , f i − 1 , l s t , k − ( l s t = = j ? 0 : 1 ) + c o s t i , j ) f_{i,j,k}=\min(f_{i,j,k},f_{i-1,lst,k-(lst==j?0:1)}+cost_{i,j}) fi,j,k=min(fi,j,k,fi1,lst,k(lst==j?0:1)+costi,j)

时间复杂度 O ( n k m 2 ) \mathcal O(nkm^2) O(nkm2),可用 st 表优化到 O ( n k m log ⁡ m ) \mathcal O(nkm\log m) O(nkmlogm)

15.CF710D Two Arithmetic Progressions(2500)

直接分治。

  • max ⁡ ( a 1 , a 2 ) < 1 0 3 \max(a1,a2) < 10^3 max(a1,a2)<103,枚举 x ∈ [ l , l + a 1 × a 2 ] x \in [l,l+a1\times a2] x[l,l+a1×a2],对于符合条件的,答案累加 ⌊ r − x a 1 × a 2 ⌋ + 1 \lfloor\frac{r-x}{a1\times a2}\rfloor+1 a1×a2rx+1,时间复杂度 O ( a 1 × a 2 ) \mathcal O(a1\times a2) O(a1×a2)
  • 否则,暴力枚举所有满足第二个条件的数,判断一下是否可行即可,时间复杂度 O ( r − l a 2 ) \mathcal O(\frac{r-l}{a2}) O(a2rl)

总时间复杂度 O ( 可 过 ) \mathcal O(可过) O()

16.CF590C Three States(2200)

可以发现图只有一种情况:即可以找到一点与三个联通块相连。

那么对于每个点,bfs 计算它与三个联通块的距离之和,取最小值即可。

时间复杂度 O ( n m α ) \mathcal O(nm \alpha) O(nmα)

17.CF1151F Sonya and Informatics(2300)

设有 m m m 0 0 0,那么题意就是让 a [ 1 , m ] a[1,m] a[1,m] 均为 0 0 0 a [ m + 1 , n ] a[m+1,n] a[m+1,n] 均为 1 1 1

f i , j f_{i,j} fi,j 表示 i i i 个操作后,前 m m m 个数中有 j j j 0 0 0 的方案数,答案即为 f k , m ∑ i = 0 m f k , i \frac{f_{k,m}}{\sum\limits_{i=0}^{m}f_{k,i}} i=0mfk,ifk,m,边界: f 0 , p = 1 f_{0,p}=1 f0,p=1 p p p 为原序列前 m m m 个数中 0 0 0 的个数。

对于 f i , j f_{i,j} fi,j,考虑它是如何转移来的:

  • 之前有 j − 1 j-1 j1 0 0 0,第 i i i 次交换换来一个 0 0 0,由于前面 1 1 1 的个数与后面 0 0 0 的个数均为 m − j + 1 m-j+1 mj+1,顾方案数为 f i − 1 , j − 1 × ( m − j + 1 ) 2 f_{i-1,j-1}\times (m-j+1)^2 fi1,j1×(mj+1)2
  • 之前有 j + 1 j + 1 j+1 0 0 0,第 i i i 次交换换走一个 0 0 0,由于前面有 j + 1 j+1 j+1 0 0 0,后面有 n − m − ( m − j − 1 ) = n − 2 m + j + 1 n-m-(m-j-1)=n-2m+j+1 nm(mj1)=n2m+j+1 1 1 1,顾方案数为 f i − 1 , j + 1 × ( j + 1 ) ( n − 2 m + j + 1 ) f_{i-1,j+1}\times (j+1)(n-2m+j+1) fi1,j+1×(j+1)(n2m+j+1)
  • 之前本来就有 j j j 0 0 0,第 i i i 次操作没换走也没换来,四种情况:前面交换,后面交换,前后交换 0 0 0,前后交换 1 1 1,则方案数为 C m 2 + C n − m 2 + j ( m − j ) + ( m − j ) ( n − 2 m + j ) C_{m}^{2}+C_{n-m}^{2}+j(m-j)+(m-j)(n-2m+j) Cm2+Cnm2+j(mj)+(mj)(n2m+j)

到这里差点结束了,总结: f i , j = f i − 1 , j − 1 × ( m − j + 1 ) 2 + f i − 1 , j + 1 × ( j + 1 ) ( n − 2 m + j + 1 ) + C m 2 + C n − m 2 + j ( m − j ) + ( m − j ) ( n − 2 m + j ) f_{i,j}=f_{i-1,j-1}\times (m-j+1)^2+f_{i-1,j+1}\times (j+1)(n-2m+j+1)+C_{m}^{2}+C_{n-m}^{2}+j(m-j)+(m-j)(n-2m+j) fi,j=fi1,j1×(mj+1)2+fi1,j+1×(j+1)(n2m+j+1)+Cm2+Cnm2+j(mj)+(mj)(n2m+j)

考虑到 k ≤ 1 0 9 k\leq 10^9 k109,经验告诉我们直接上矩阵快速幂,毕竟这转移无需判断。
[ c 0 b 1 0 0 ⋯ 0 a 0 c 1 b 2 0 ⋯ 0 0 a 1 c 2 b 3 ⋯ 0 0 0 a 2 c 3 ⋯ 0 0 0 0 a 3 ⋯ 0 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ 0 0 0 0 ⋯ c m ] × [ f i − 1 , 0 f i − 1 , 1 f i − 1 , 2 f i − 1 , 3 f i − 1 , 4 ⋯ f i − 1 , m ] = [ f i , 0 f i , 1 f i , 2 f i , 3 f i , 4 ⋯ f i , m ] \begin{bmatrix}c_0& b_1& 0 & 0&\cdots & 0\\ a_0 & c_1 & b_2 & 0&\cdots & 0\\ 0 & a_1 & c_2 & b_3 & \cdots & 0\\ 0&0&a_2&c_3&\cdots&0\\ 0&0&0&a_3&\cdots&0\\ \cdots&\cdots&\cdots&\cdots&\cdots&\cdots\\ 0&0&0&0&\cdots&c_m\end{bmatrix} \times \begin{bmatrix}f_{i-1,0}\\f_{i-1,1}\\f_{i-1,2}\\f_{i-1,3}\\f_{i-1,4}\\ \cdots \\f_{i-1,m}\end{bmatrix}=\begin{bmatrix}f_{i,0}\\f_{i,1}\\f_{i,2}\\f_{i,3}\\f_{i,4}\\ \cdots \\f_{i,m}\end{bmatrix} c0a00000b1c1a10000b2c2a20000b3c3a3000000cm×fi1,0fi1,1fi1,2fi1,3fi1,4fi1,m=fi,0fi,1fi,2fi,3fi,4fi,m
其中 a i = ( m − i ) 2 a_i=(m-i)^2 ai=(mi)2 b i = i ( n − 2 m + i ) b_i=i(n-2m+i) bi=i(n2m+i) c i = C m 2 + C n − m 2 + i ( m − i ) + ( m − i ) ( n − 2 m + i ) c_i=C_{m}^{2}+C_{n-m}^{2}+i(m-i)+(m-i)(n-2m+i) ci=Cm2+Cnm2+i(mi)+(mi)(n2m+i)

时间复杂度 O ( n 3 log ⁡ k ) \mathcal O(n^3\log k) O(n3logk)

18.CF840D Destiny(2500)

可持久化值域线段树,每次先判区间 [ l , r ] [l,r] [l,r] [ l ′ , m i d ] [l',mid] [l,mid] 的数的个数 × k > r − l + 1 \times k>r-l+1 ×k>rl+1,然后在判右区间即可,注意:如果左区间没有,可能出现在右区间中,不能直接返回。时间复杂度 O ( n log ⁡ n ) \mathcal O(n \log n) O(nlogn)

19.CF594D REQ(2500)

根据 φ \varphi φ 的规律,设 n = ∏ i p i a i n=\prod\limits_{i}{p_i^{a_i}} n=ipiai,则有 φ ( n ) = n × ∏ i p i − 1 p i \varphi(n)=n\times\prod\limits_{i}{\frac{p_i-1}{p_i}} φ(n)=n×ipipi1

故区间 φ \varphi φ 可先前缀积算前面那个,后面那么直接看区间出现哪些质数即可。

考虑离线,我们将询问按照右端点排序,维护一个右指针,将 a i a_i ai 逐个加入,用树状数组维护每个位置对答案的贡献。

预处理所有质数, log ⁡ V \log V logV 枚举找质因子,对于重复出现的质因子,维护 l s t i lst_i lsti 表示质因子 i i i 上次出现的位置,将上次的贡献消去即可。

时间复杂度 O ( ( n + q ) log ⁡ n log ⁡ V ) \mathcal O((n+q)\log n\log V) O((n+q)lognlogV)(其中 V V V 表示值域 [ 1 , n ] [1,n] [1,n])。

20.CF848C Goodbye Souvenir(2600)

带修改三维偏序。

∑ i i − p r e a i [ i ≤ R ] [ p r e a i ≥ L ] \sum\limits_i i-pre_{a_i}[i \leq R][pre_{a_i} \ge L] iipreai[iR][preaiL]

三维分别为:

  • i ≤ R i \leq R iR
  • p r e a i ≥ L pre_{a_i} \ge L preaiL
  • 时间轴 t t t

权值为 i − p r e a i i - pre_{a_i} ipreai

set 维护 p r e pre pre

时间复杂度 O ( n log ⁡ n 2 ) \mathcal O(n \log n^2) O(nlogn2)

21.CF527E Data Center Drama(2600)

若每个点的出入度都是偶数,则每个点的总度数是偶数,是一张图存在欧拉回路的充要条件。

对于原图,先把总度数是奇数的两两相连,就保证了存在欧拉回路。

但这样不能保证每个点出度和出度都是偶数。

可能存在每个点的边数都是偶数,但是总边数为奇数

如:

1-2 , 2-3, 1-3

所以要随便找一个点连个自环,这样就能保证总边数是偶数。

最后跑一边欧拉回路,边的方向交替,这样就能保证对于一个点再出去的这两条边要么同时是出边,要么同时是入边。

时间复杂度 O ( m ) \mathcal O(m) O(m)

22.CF1603D Artistic Partition(3000)

f i , k f_{i,k} fi,k 表示前 i i i 个数分成 k k k 段的最小值。

转移方程:
f i , k = min ⁡ j = 1 i { f j − 1 , k − 1 + c ( j , i ) } f_{i,k}=\min_{j=1}^{i}\{f_{j-1,k-1}+c(j,i)\} fi,k=j=1mini{fj1,k1+c(j,i)}
优化:观察得:如果 2 k − 1 > n 2^{k-1}>n 2k1>n 那么答案即为 n n n,考虑在第 i i i 段放 2 i − 1 2^{i-1} 2i1 个数(最后一段除外),只有 ( x , x ) (x,x) (x,x) 的整数对会产生贡献,故 j j j 上界为 18 18 18。可以在时间限制内预处理 f f f 数组,后 O ( 1 ) \mathcal O(1) O(1) 回答询问即可。

考虑到 ≥ \ge 有点难处理,故设 g ( n , k ) = ∑ i = 1 n ∑ j = 1 n [ gcd ⁡ ( i , j ) ≤ k ] g(n,k)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}[\gcd(i,j)\leq k] g(n,k)=i=1nj=1n[gcd(i,j)k],则 c ( n , k ) = n ( n + 1 ) 2 − g ( n , k ) c(n,k)=\frac{n(n+1)}{2}-g(n,k) c(n,k)=2n(n+1)g(n,k) f i , k = min ⁡ j = 1 i ( f j − 1 , k − 1 + i ( i + 1 ) 2 − g ( j , i ) ) f_{i,k}=\min\limits_{j=1}^{i}(f_{j-1,k-1}+\frac{i(i+1)}{2}-g(j,i)) fi,k=j=1mini(fj1,k1+2i(i+1)g(j,i))

考虑使用线段树优化 min ⁡ \min min,在 O ( log ⁡ n ) \mathcal O(\log n) O(logn) 的时间内找到最小的 f j − 1 k − 1 + g ( j , i ) f_{j-1}{k-1}+g(j,i) fj1k1+g(j,i)

再根据莫反知识,有:
g ( n , k ) = ∑ i = 1 n ∑ j = 1 n [ gcd ⁡ ( i , j ) ≤ k ] = ∑ d = 1 k ∑ i = 1 n ∑ j = i n [ gcd ⁡ ( i , j ) = d ] = ∑ d = 1 k ∑ i = 1 ⌊ n d ⌋ ∑ j = i ⌊ n d ⌋ [ gcd ⁡ ( i , j ) = 1 ] = ∑ d = 1 k 1 + ∑ p = 1 ⌊ n d ⌋ μ ( p ) ⌊ n d p ⌋ 2 2 \begin{aligned} g(n,k)&=\sum_{i=1}^{n}\sum_{j=1}^{n}[\gcd(i,j)\leq k]\\ &=\sum_{d=1}^{k}\sum_{i=1}^{n}\sum_{j=i}^{n}[\gcd(i,j)=d]\\ &=\sum_{d=1}^{k}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=i}^{\lfloor\frac{n}{d}\rfloor}[\gcd(i,j)=1]\\ &=\sum_{d=1}^{k}\frac{1+\sum\limits_{p=1}^{\lfloor\frac{n}{d}\rfloor}\mu(p)\lfloor\frac{n}{dp}\rfloor^2}{2} \end{aligned} g(n,k)=i=1nj=1n[gcd(i,j)k]=d=1ki=1nj=in[gcd(i,j)=d]=d=1ki=1dnj=idn[gcd(i,j)=1]=d=1k21+p=1dnμ(p)dpn2
考虑怎样维护,我们发现当 n n n n − 1 n-1 n1 变到 n n n 时,只有那些 d ∣ n d|n dn ∑ p = 1 ⌊ n d ⌋ \sum\limits_{p=1}^{\lfloor\frac{n}{d}\rfloor} p=1dn 会发生改变,故预处理因子维护增量即可。

时间复杂度 O ( n ln ⁡ n log ⁡ 2 n ) \mathcal O(n \ln n \log^2 n) O(nlnnlog2n)

23.CF516E Drazil and His Happy Friends(3100)

同余最短路,下文记 B B B 为初始开心的男生, G G G 为初始开心的女生。

我们求出 d = g c d ( n , m ) d=gcd(n,m) d=gcd(n,m),显然模 d d d 不同余的男女生之间永远不可能相互影响。

故当 d > B + G d>B+G d>B+G 时原问题无解。

显然如果编号为 i   m o d   m i \bmod m imodm 的女生在第 i i i 个时刻结束后是快乐的,那么在第 i + m i+m i+m 个时刻第 ( i + m )   m o d   n (i+m)\bmod n (i+m)modn 个男生就会变快乐。

等价于如果编号为 i   m o d   n i \bmod n imodn 的男生在第 i i i 个时刻结束后是快乐的,那么在第 i + m i+m i+m 个时刻第 ( i + m )   m o d   n (i+m)\bmod n (i+m)modn 个男生就会变快乐。

先直接处理掉一开始快乐的女生,让对应编号的男生变快乐。

接下来考虑给男生重新编号,让原本编号为 k m   m o d   n km\bmod n kmmodn 的男生的编号变为 k k k

那么就变成了当一个男生快乐之后一段时间,下一个男生就会变快乐,所有男生形成一个大环。

则对于两个相邻的初始快乐的男生 x , y x,y x,y 之间的所有男生,显然都是因男生 x x x 变快乐的,且第 y − 1 y-1 y1 个男生肯定是最大的,需 ( y − x − 1 ) × m (y−x−1)\times m (yx1)×m 个时刻实现这一转变。

那么对于一个子问题中男生的情况,只要枚举所有初始快乐的男生求一下最大时刻即可。

接着再处理女生的情况。

时间复杂度 O ( ( B + G ) log ⁡ ( B + G ) ) \mathcal O((B+G)\log (B+G)) O((B+G)log(B+G))

24.CF1017G The Tree(3200)

树链剖分 + + + 线段树。

考虑操作 1 1 1,对于一个点 x x x,一个点 y y y 的修改能够使 x x x 变成黑色,当且仅当 y y y x x x 的祖先,并且 x x x y y y 路径上所有点的操作次数之和大于 x , y x,y x,y 之间的距离。

然后将模型进行如下转化:每个点有一个点权,初始是 − 1 −1 1,每次操作将某个点的点权加 1 1 1,或者询问一个点 x x x 到根路径上是否存在另一个点 y y y,满足 x , y x,y x,y 之间路径上的点权之和 ≥ 0 ≥0 0,线段树 + + + 树链剖分维护后缀最大值即可。

接下来考虑操作 2 2 2,即使 x x x x x x 子树内的点到根节点路径上权值的最大前缀和为 − 1 -1 1。很明显,我们需要让 x x x 点的权值减去此时 x x x 点到根节点路径上的最大前缀和 + 1 +1 +1,线段树单点修改即可。注意还需将 x x x 子树内除 x x x 的点权值设为 − 1 -1 1

时间复杂度 O ( n log ⁡ 2 n ) \mathcal O(n \log^2 n) O(nlog2n)

25.CF1592F1 Alice and Recoloring 1(2600)

发现操作 2 2 2 和操作 3 3 3 的等效于执行 2 2 2 次操作 1 1 1,更优。

a x , y a_{x,y} ax,y 表示 ( x , y ) (x,y) (x,y) 是否为黑色,再记 b x , y = a x , y ⊕ a x , y + 1 ⊕ a x + 1 , y ⊕ a x + 1 , y + 1 b_{x,y}=a_{x,y}\oplus a_{x,y+1}\oplus a_{x+1,y}\oplus a_{x+1,y+1} bx,y=ax,yax,y+1ax+1,yax+1,y+1,可以发现操作 1 1 1 等价于翻转 b x , y b_{x,y} bx,y,而操作 4 4 4 等价于翻转 b x − 1 , y − 1 , b x − 1 , m , b n , y − 1 , b n , m b_{x-1,y-1},b_{x-1,m},b_{n,y-1},b_{n, m} bx1,y1,bx1,m,bn,y1,bn,m

注意到我们使用 4 4 4 操作的次数不会超过 1 1 1,因为两次操作 4 4 4 可用六次操作 1 1 1 代替,代价相等不会更劣。

这样统计有多少个 b x , y = 1 b_{x,y}=1 bx,y=1再统计一下是否存在一组 ( x , y ) (x,y) (x,y),满足 b x − 1 , y − 1 , b x − 1 , m , b n , y − 1 , b n , m b_{x-1,y-1},b_{x-1,m},b_{n,y-1},b_{n,m} bx1,y1,bx1,m,bn,y1,bn,m 均为 1 1 1,若存在,答案减少 1 1 1

时间复杂度 O ( n m ) \mathcal O(nm) O(nm)

26.CF1592F2 Alice and Recoloring 2(2800)

与上题相似。

发现要尽可能多得使用操作 4 4 4

二分图匹配即可。

时间复杂度 O ( n 2 n ) \mathcal O(n^2\sqrt n) O(n2n )

27.AT2300 [ARC068C] Snuke Line(2307)

对于一个 d d d 和给定的 ( l , r ) (l,r) (l,r) ( l , r ) (l,r) (l,r) 对其造成贡献的条件显然是 ⌊ l − 1 d ⌋ ≠ ⌊ r d ⌋ \lfloor\frac{l-1}{d}\rfloor \ne \lfloor\frac{r}{d}\rfloor dl1=dr

数论分块即可。

时间复杂度 O ( n n ) \mathcal O(n\sqrt n) O(nn )

28.CF1521D Nastia Plays with a Tree(2500)

贪心。

设一个点 u u u c c c 个儿子,则:

  • c ≤ 1 c \leq 1 c1,不执行。
  • c = 2 c=2 c=2,切断 u u u u u u 父亲的连边。
  • c ≥ 3 c \ge 3 c3,切断 u u u u u u 父亲的连边,然后切断 u u u u u u 的任意 c − 2 c-2 c2 个儿子的连边。

最后将切下来的几条链连起来即可。

时间复杂度 O ( n ) \mathcal O(n) O(n)

29.CF1455F String and Operations(2800)

注意到进行完前 i i i 次操作之后, s i + 1 s_{i+1} si+1 要么在 i i i,要么在 i + 1 i+1 i+1,取决于上一次 s i s_i si 是否在 i i i 位置且上一次执行的是否是 R 操作。

因此设 d p i , 0 / 1 dp_{i,0/1} dpi,0/1 表示进行完前 i i i 次操作后, s i + 1 s_{i+1} si+1 否/是被移到了 i i i 位置后最小的字典序,转移就分 OUDLR 五种情况转移即可,时间复杂度 O ( n 2 ) \mathcal O(n^2) O(n2)

注意到每次操作影响的区间极小,可维护,时间复杂度优化至 O ( n ) \mathcal O(n) O(n)

30.CF1491H Yuezheng Ling and Dynamic Tree(3400)

考虑根号做法,对编号分块。

p a i pa_i pai 表示点 i i i 离开块的第一个祖先, f a i fa_i fai 表示父亲。

对于询问,不断像树剖那样跳父亲即可,单次 O ( n ) \mathcal O(\sqrt n) O(n )

对于修改,散块暴力,整块也暴力。

因为 f a i < i fa_i<i fai<i 且每次修改 f a i fa_i fai 都会减少,故对一个块修改 n \sqrt n n f a i fa_i fai 后,块内每个元素跳 f a i fa_i fai 都会跳出块,此时 p a i = f a i pa_i=fa_i pai=fai,打个标记即可,上界 O ( n n ) \mathcal O(n\sqrt n) O(nn )

时间复杂度 O ( n n ) \mathcal O(n\sqrt n) O(nn )

31.CF464E The Classic Problem(3000)

考虑 dij

瓶颈在于高效维护一个高精数,考虑线段树维护二进制位,主席树节约空间。

对于修改,因为是二进制位加 1 1 1,原为 0 0 0 1 1 1;原为 1 1 1,二分极长 1 1 1 段修改即可, O ( log ⁡ 2 n ) \mathcal O(\log^2 n) O(log2n)

对于比较,哈希,线段树上二分即可, O ( log ⁡ n ) \mathcal O(\log n) O(logn)

dij O ( n log ⁡ n ) \mathcal O(n\log n) O(nlogn),时间复杂度 O ( n log ⁡ 2 n ) \mathcal O(n \log ^2 n) O(nlog2n)

32.P4175 [CTSC2008]网络管理(紫)

动态链上第 k k k 大。考虑树状数组 + + + 主席树。

树状数组上每一个节点都是一棵主席树。

对于修改,树状数组上区间修改即可, O ( log ⁡ 2 n ) \mathcal O(\log^2 n) O(log2n)

对于查询,差分,主席树求第 k k k 大, O ( log ⁡ 2 n ) \mathcal O(\log^2 n) O(log2n)

时间复杂度 O ( n log ⁡ 2 n ) \mathcal O(n \log^2 n) O(nlog2n)

33.CF1009F Dominant Indices(2300)

f u , d f_{u,d} fu,d 表示 u u u 的子树中与 u u u 距离为 d d d 的节点数。

则: f u , d = ∑ v ∈ s o n u f v , d − 1 f_{u,d}=\sum\limits_{v\in son_u}f_{v,d-1} fu,d=vsonufv,d1,时间复杂度 O ( n 2 ) \mathcal O(n^2) O(n2)

考虑到转移方程与深度有关,容易想到长链剖分优化。

遍历到点 u u u O ( 1 ) \mathcal O(1) O(1) 继承长儿子的答案,遍历短儿子, O ( l e n u ) \mathcal O(len_u) O(lenu) 暴力合并( l e n u len_u lenu 表示 u u u 的最深儿子的与 u u u 的距离)。

由于每个节点只会在它所在的长链顶端被暴力合并一次,故时间复杂度 O ( n ) \mathcal O(n) O(n)

34.CF1609F Interesting Sections(2800)

枚举最大值和最小值的 popcount,扫描线枚举右端点 r r r,记 f l f_l fl 表示 [ l , r ] [l,r] [l,r] 中最大值是否等于枚举的 popcount + + + [ l , r ] [l,r] [l,r] 中最小值是否为枚举的 popcount,单调栈维护 f l f_l fl 的变化,那么答案即为 f l = 2 f_l=2 fl=2 l l l 的个数,线段树维护即可。时间复杂度均摊 O ( n ( log ⁡ n + log ⁡ V ) ) \mathcal O(n(\log n + \log V)) O(n(logn+logV))

35.CF633G Yash And Trees(2800)

dfs 序把树拍成区间,转化为区间问题。

建线段树,维护区间 bitset 表示一个数是否在区间内出现过。

答案即为区间的 bitset & \& & 质数集的 bitset 得到的 bitset 1 1 1 的个数。

时间复杂度 O ( n m log ⁡ n ω ) \mathcal O(\frac{nm\log n}{\omega}) O(ωnmlogn)

36.P4755 Beautiful Pair(紫)

分治,对于每一层 ( L , R ) (L,R) (L,R)st 表找出区间最大值位置 p p p

遍历 [ L , p ] , [ p , R ] [L,p],[p,R] [L,p],[p,R] 中长度短的区间,计算他与另一区间的答案,遍历时间复杂度均摊 O ( n log ⁡ n ) \mathcal O(n \log n) O(nlogn)

答案即为满足 a i × a j ≤ a p a_i\times a_j \leq a_p ai×ajap,即 a j ≤ ⌊ a p a i ⌋ a_j\leq \lfloor\frac{a_p}{a_i}\rfloor ajaiap 的二元组 ( i , j ) (i,j) (i,j) 的个数,用主席树维护即可。

时间复杂度 O ( n log ⁡ 2 n ) \mathcal O(n \log ^2 n) O(nlog2n)

37.P2605 [ZJOI2010]基站选址(黑)

线段树优化 dp

f i , j f_{i,j} fi,j 表示第 i i i 位置建第 j j j 个基站的最小费用。

则有: f i , j = min ⁡ k = 1 i − 1 ( f k , j − 1 + c o s t k , i ) f_{i,j}=\min\limits_{k=1}^{i-1}(f_{k,j-1}+cost_{k,i}) fi,j=k=1mini1(fk,j1+costk,i),其中 c o s t i , j cost_{i,j} costi,j 表示 k , i k,i k,i 两点间没有基站的赔偿费用。

另,要在 + ∞ +\infty + 位置建立一个费用为 0 0 0,覆盖距离为 0 0 0 的基站,起到统计答案的作用。

时间复杂度 O ( n 3 k ) \mathcal O(n^3k) O(n3k)

考虑优化,发现 min ⁡ \min min 即区间最小值,可用线段树优化。

s t i , e d i st_i,ed_i sti,edi 分别表示在区间 [ d i − s i , d i + s i ] [d_i-s_i,d_i+s_i] [disi,di+si] 的点的最小及最大编号。

若当前枚举的点 i = e d k i=ed_k i=edk,那么线段树上区间 [ 1 , s t k − 1 ] [1,st_k-1] [1,stk1] 加上 w k w_k wk

因为后面的点要是从 [ 1 , s t k − 1 ] [1,st_k-1] [1,stk1] 的点转移,那么 k k k 就无法被覆盖到,所以要加上赔偿费用。

最后区间查询最小值即可。

时间复杂度 O ( n k log ⁡ n ) \mathcal O(nk \log n) O(nklogn)

38.P3242 [HNOI2015] 接水果(紫)

整体二分练手题。

考虑一条路径 ( x , y ) (x,y) (x,y) 被另一条路径 ( u , v ) (u,v) (u,v) 包含的本质。

考虑 dfs 序,设 s t x = d f n x st_x=dfn_x stx=dfnx,$ e d x = d f n x + s i z x − 1 ed_x=dfn_x+siz_x-1 edx=dfnx+sizx1

不妨设 s t x < s t y st_x<st_y stx<sty

  • LCA ⁡ ( x , y ) = x \operatorname{LCA}(x,y)=x LCA(x,y)=x

    u ∈ [ 1 , s t z − 1 ] u\in [1,st_z-1] u[1,stz1] u ∈ [ e d z + 1 , n ] u \in[ed_z+1,n] u[edz+1,n] v ∈ [ s t y , e d y ] v \in [st_y,ed_y] v[sty,edy],其中 z z z x → y x \to y xy 路径上 x x x 的第一个儿子。

  • L C A ( x , y ) ≠ x LCA(x,y) \ne x LCA(x,y)=x

    u ∈ [ s t x , e d x ] u\in [st_x,ed_x] u[stx,edx] v ∈ [ s t y , e d y ] v \in [st_y,ed_y] v[sty,edy]

由于题目查询第 k k k 大,考虑整体二分。

整体二分加扫描线,时间复杂度 O ( n log ⁡ 2 n ) \mathcal O(n \log^2 n) O(nlog2n),空间复杂度 O ( n ) \mathcal O(n) O(n)

39.UVA11990 ``Dynamic’’ Inversion(紫)

对于每一个被删的三元组 ( i , t i , a i ) (i,t_i,a_i) (i,ti,ai)(分别表示第 i i i 个数的位置,删除时间及权值),消失的逆序对 ( i , j ) (i,j) (i,j) 为:

  • 满足 j < i , a j > a i , t j > t i j<i,a_j>a_i,t_j>t_i j<i,aj>ai,tj>ti j j j
  • 满足 j > i , a j < a i , t j > t i j > i,a_j<a_i,t_j>t_i j>i,aj<ai,tj>ti j j j

明显的三维偏序问题,做一次 CDQ 即可。

时间复杂度 O ( n log ⁡ 2 n ) \mathcal O(n \log^2 n) O(nlog2n)

40.P4690 [Ynoi2016] 镜中的昆虫(黑)

首先考虑经典数颜色套路,设 p r e i pre_i prei 表示上一个与 a i a_i ai 相同的数的位置。

对于区间赋值操作,我们发现性质: ∀ i ∈ ( l , r ] , p r e i ← i − 1 \forall i\in(l,r],pre_i ←i-1 i(l,r],preii1,对于 i = l i=l i=l 或区间外的情况特判即可。

考虑使用 ODT 维护 p r e pre pre 的修改,一个 ODT 维护序列,一个 ODT 数组维护颜色位置,均摊修改次数为 O ( n ) \mathcal O(n) O(n)(增加节点总数 O ( n ) \mathcal O(n) O(n),删除节点总数 O ( n ) \mathcal O(n) O(n)),时间复杂度 O ( n log ⁡ n ) \mathcal O(n\log n) O(nlogn)

那么问题转化为带修求 ∑ i = l r [ p r e i < l ] \sum\limits_{i=l}^{r}[pre_i<l] i=lr[prei<l],考虑到要求线性空间,故使用三维 cdq,时间复杂度 O ( n log ⁡ 2 n ) \mathcal O(n \log^2 n) O(nlog2n)

时间复杂度 O ( n log ⁡ 2 n ) \mathcal O(n \log ^2 n) O(nlog2n),空间复杂度 O ( n ) \mathcal O(n) O(n)

41.P8353 [SDOI/SXOI2022] 无处存储(黑)

看空间限制, O ( n ) \mathcal O(n) O(n) 大小的数组最多只能开两个。

首先排除线段树做法,树状数组做法三个 O ( n ) \mathcal O(n) O(n),也不行。

考虑分块,时空 O ( n ) \mathcal O(\sqrt n) O(n )

既然用了分块,那么就要彻彻底底,排除所有 O ( log ⁡ n ) \mathcal O(\log n) O(logn) 做法,考虑树分块。

随机撒点,建虚树,分类讨论跳关键点间的块链即可。

时间复杂度 O ( q n ) \mathcal O(q\sqrt n) O(qn ),空间复杂度 O ( 2 n + n ) \mathcal O(2n+\sqrt n) O(2n+n )

42.P4899 [IOI2018] werewolf 狼人(黑)

首先发现题意等价于从 s s s 出发能到达的编号 ≥ l \ge l l 的点集和从 t t t 出发能到达的编号 ≤ r \leq r r 的点集是否有交集。

于是考虑建 A , B A,B A,B 两棵 kruskal 重构树,分别以边连的两点的编号最小值和最大值为边权,建最大重构树和最小重构树。

根据重构树的性质,从 x x x 出发只经过编号 ≥ l \geq l l 的点能到达的点集 = = = A A A x x x 的祖先节点深度最小的点券 ≥ l \geq l l 的点 z z z 的子树中原来的点集。反之同理。

故主席树求并集即可。

时间复杂度 O ( n log ⁡ n ) \mathcal O(n \log n) O(nlogn)

43.P3760 [TJOI2017] 异或和(紫)

算前缀和,转化为 O ( n 2 ) \mathcal O(n^2) O(n2) 求区间异或和。

考虑枚举左端点 l l l,加速求这个左端点的贡献,考虑 l → l − 1 l\to l-1 ll1 的贡献变化。

发现变化是每一项同时加一个值后再查询异或和,01-trie 维护。

由于 trie 全体加一个值过于困难,考虑到 ∑ a i ≤ 1 0 6 \sum a_i\leq10^6 ai106,执行 a i a_i aitrie 全体加 1 1 1 即可,因为加 1 1 1 容易维护。

时间复杂度 O ( ( n + ∑ a i ) log ⁡ a i ) \mathcal O((n+\sum a_i)\log a_i) O((n+ai)logai)

44.CF1515E Phoenix and Computers(2200)

性质:划分成若干段,段之间空一个位置,段长和加空格数为 n n n

f i , j f_{i,j} fi,j 表示开 i i i 台机器构成了 j j j 段的方案数。

转移方程:

  • 新开一段: f i + 1 , j + 1 ← ( j + 1 ) f i , j f_{i+1,j+1}\leftarrow (j+1)f_{i,j} fi+1,j+1(j+1)fi,j,表示在前中后 j + 1 j+1 j+1 个空开一段。
  • 在原来某一段的左边或者右边加一台: f i + 1 , j ← 2 j f i , j f_{i+1,j}\leftarrow 2jf_{i,j} fi+1,j2jfi,j

注意上面的转移不需要讨论段之间相交的,相交就移开。

边界 f 1 , 1 = 0 f_{1,1}=0 f1,1=0,满足 i + j − 1 = n i+j-1=n i+j1=n f i , j f_{i,j} fi,j 向答案做贡献。

时间复杂度 O ( n 2 ) \mathcal O(n^2) O(n2)

45.AT2273 [ARC066C] Addition and Subtraction Hard

性质:

  1. 括号都用在减号后。
  2. 减号后加括号除了这个减号和下一个减号之间的数减去,后面所有数都可加上绝对值,显然这个括号最优是右括号放在最后。

故枚举加括号的位置,前缀和优化即可。

时间复杂度 O ( n ) \mathcal O(n) O(n)

46.P4103 [HEOI2014]大工程(紫)

建虚树。

对于第一问,统计树边对答案的贡献即可。

对于第二,三问,记 f x f_x fx 表示在 x x x 子树内离 x x x 距离最远的关键点距离, g x g_x gx 表示在 x x x 子树内离 x x x 距离最近的关键点距离。

则答案 ← f u + dis ⁡ ( u , v ) + f v \leftarrow f_u+\operatorname{dis}(u,v)+f_v fu+dis(u,v)+fv

然后更新, f u ← f v + dis ⁡ ( u , v ) f_u\leftarrow f_v+\operatorname{dis}(u,v) fufv+dis(u,v)

时间复杂度 O ( n log ⁡ n ) \mathcal O(n\log n) O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值