1.CF592D Super M(2200)
O ( n ) \mathcal O(n) O(n) 暴力建虚树,答案即为 ( n − 1 ) × 2 − m x (n-1)\times 2-mx (n−1)×2−mx( 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=1∑sum−1fn,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=m−1k=1∑mfi−1,j−k(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 2k−1 个 3 3 3 和一个 2 2 2,易知这样是正确的,故只需要 3 3 3 种颜色。
考虑第二问,如果若干个叶子节点父亲相同,这些节点所连边的权值也必须相同,否则随便填,一定可以满足,算一下每个点叶子儿子个数即可。
时间复杂度 O ( n ) \mathcal O(n) O(n)。
6.CF1338C Perfect Triples(2200)
找规律。
- a a a 的取值把序列分成了若干块,每一块内的 a a a 都是从 2 k 2^k 2k 到 2 k + 1 − 1 2^{k+1}-1 2k+1−1 的连续整数。
- 同一块内, b b b 的取值可以递归构造。每次将大块分成四小块,分别取第 1 , 3 , 4 , 2 1,3,4,2 1,3,4,2 小的值。
- 同一块内, 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 k≥2m,无解。其次,由 0 ⊕ 1 ⊕ ⋯ ⊕ ( 2 m − 1 ) = 0 0⊕1⊕\cdots ⊕ (2^m-1)=0 0⊕1⊕⋯⊕(2m−1)=0 启发,按如下方法构造 ( 0 , 1 , 2 , ⋯ , 2 m − 1 ) ( 不 包 括 k ) (0,1,2,\cdots,2^m-1)(不包括 \ k) (0,1,2,⋯,2m−1)(不包括 k), k k k, ( 0 , 1 , 2 , ⋯ , 2 m − 1 ) ( 不 包 括 k ) (0,1,2,\cdots,2^m-1)(不包括 \ k) (0,1,2,⋯,2m−1)(不包括 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 S≤108,那么当 l < 1 0 7 l < 10^7 l<107 时, r < = 23000000 r <= 23000000 r<=23000000,尺取即可。
当 l ≥ 1 0 7 l \ge 10^7 l≥107 时,有 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 t≤⌊8n⌋),分类讨论 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+q≡1(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+q≡j(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,t−ai+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=0∑i−1fi,j−1,k⊕2m。
时间复杂度 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,fi−1,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,fi−1,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×a2r−x⌋+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(a2r−l)。
总时间复杂度 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=0∑mfk,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 j−1 个 0 0 0,第 i i i 次交换换来一个 0 0 0,由于前面 1 1 1 的个数与后面 0 0 0 的个数均为 m − j + 1 m-j+1 m−j+1,顾方案数为 f i − 1 , j − 1 × ( m − j + 1 ) 2 f_{i-1,j-1}\times (m-j+1)^2 fi−1,j−1×(m−j+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 n−m−(m−j−1)=n−2m+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) fi−1,j+1×(j+1)(n−2m+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+Cn−m2+j(m−j)+(m−j)(n−2m+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=fi−1,j−1×(m−j+1)2+fi−1,j+1×(j+1)(n−2m+j+1)+Cm2+Cn−m2+j(m−j)+(m−j)(n−2m+j)。
考虑到
k
≤
1
0
9
k\leq 10^9
k≤109,经验告诉我们直接上矩阵快速幂,毕竟这转移无需判断。
[
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}
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡c0a0000⋯0b1c1a100⋯00b2c2a20⋯000b3c3a3⋯0⋯⋯⋯⋯⋯⋯⋯00000⋯cm⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤×⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡fi−1,0fi−1,1fi−1,2fi−1,3fi−1,4⋯fi−1,m⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡fi,0fi,1fi,2fi,3fi,4⋯fi,m⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
其中
a
i
=
(
m
−
i
)
2
a_i=(m-i)^2
ai=(m−i)2,
b
i
=
i
(
n
−
2
m
+
i
)
b_i=i(n-2m+i)
bi=i(n−2m+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+Cn−m2+i(m−i)+(m−i)(n−2m+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>r−l+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=i∏piai,则有 φ ( n ) = n × ∏ i p i − 1 p i \varphi(n)=n\times\prod\limits_{i}{\frac{p_i-1}{p_i}} φ(n)=n×i∏pipi−1。
故区间 φ \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] i∑i−preai[i≤R][preai≥L]。
三维分别为:
- i ≤ R i \leq R i≤R。
- p r e a i ≥ L pre_{a_i} \ge L preai≥L。
- 时间轴 t t t。
权值为 i − p r e a i i - pre_{a_i} i−preai。
用 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{fj−1,k−1+c(j,i)}
优化:观察得:如果
2
k
−
1
>
n
2^{k-1}>n
2k−1>n 那么答案即为
n
n
n,考虑在第
i
i
i 段放
2
i
−
1
2^{i-1}
2i−1 个数(最后一段除外),只有
(
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=1∑nj=1∑n[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(fj−1,k−1+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) fj−1k−1+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=1∑nj=1∑n[gcd(i,j)≤k]=d=1∑ki=1∑nj=i∑n[gcd(i,j)=d]=d=1∑ki=1∑⌊dn⌋j=i∑⌊dn⌋[gcd(i,j)=1]=d=1∑k21+p=1∑⌊dn⌋μ(p)⌊dpn⌋2
考虑怎样维护,我们发现当
n
n
n 由
n
−
1
n-1
n−1 变到
n
n
n 时,只有那些
d
∣
n
d|n
d∣n 的
∑
p
=
1
⌊
n
d
⌋
\sum\limits_{p=1}^{\lfloor\frac{n}{d}\rfloor}
p=1∑⌊dn⌋ 会发生改变,故预处理因子维护增量即可。
时间复杂度 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 y−1 个男生肯定是最大的,需 ( y − x − 1 ) × m (y−x−1)\times m (y−x−1)×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,y⊕ax,y+1⊕ax+1,y⊕ax+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} bx−1,y−1,bx−1,m,bn,y−1,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} bx−1,y−1,bx−1,m,bn,y−1,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 ⌊dl−1⌋=⌊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 c≤1,不执行。
- 若 c = 2 c=2 c=2,切断 u u u 和 u u u 父亲的连边。
- 若 c ≥ 3 c \ge 3 c≥3,切断 u u u 和 u u u 父亲的连边,然后切断 u u u 和 u u u 的任意 c − 2 c-2 c−2 个儿子的连边。
最后将切下来的几条链连起来即可。
时间复杂度 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=v∈sonu∑fv,d−1,时间复杂度 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×aj≤ap,即 a j ≤ ⌊ a p a i ⌋ a_j\leq \lfloor\frac{a_p}{a_i}\rfloor aj≤⌊aiap⌋ 的二元组 ( 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=1mini−1(fk,j−1+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] [di−si,di+si] 的点的最小及最大编号。
若当前枚举的点 i = e d k i=ed_k i=edk,那么线段树上区间 [ 1 , s t k − 1 ] [1,st_k-1] [1,stk−1] 加上 w k w_k wk。
因为后面的点要是从 [ 1 , s t k − 1 ] [1,st_k-1] [1,stk−1] 的点转移,那么 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+sizx−1。
不妨设 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,stz−1] 或 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 x→y 路径上 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],prei←i−1,对于 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=l∑r[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 l→l−1 的贡献变化。
发现变化是每一项同时加一个值后再查询异或和,01-trie
维护。
由于 trie
全体加一个值过于困难,考虑到
∑
a
i
≤
1
0
6
\sum a_i\leq10^6
∑ai≤106,执行
a
i
a_i
ai 次 trie
全体加
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,j←2jfi,j。
注意上面的转移不需要讨论段之间相交的,相交就移开。
边界 f 1 , 1 = 0 f_{1,1}=0 f1,1=0,满足 i + j − 1 = n i+j-1=n i+j−1=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
性质:
- 括号都用在减号后。
- 减号后加括号除了这个减号和下一个减号之间的数减去,后面所有数都可加上绝对值,显然这个括号最优是右括号放在最后。
故枚举加括号的位置,前缀和优化即可。
时间复杂度 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) fu←fv+dis(u,v)。
时间复杂度 O ( n log n ) \mathcal O(n\log n) O(nlogn)。