Petrozavodsk Summer 2023. Day 7.
Link \text{Link} Link
称一个长度为 n n n 的正整数数列是“好的”,当且仅当存在一个 k k k ,使得 1 ∼ k 1\sim k 1 ∼ k 均在 a 1 ∼ n a_{1\sim n} a 1 ∼ n 中出现过,且 max i = 1 n a i = k \max_{i=1}^n a_i=k max i = 1 n a i = k 。先给出一个序列,每次操作可以把其中一个数 + 1 +1 + 1 或 − 1 -1 − 1 ,求将其变为“好的”数列的最小操作次数。1 ≤ n , a i ≤ 1 0 6 1\le n,a_i\le 10^6 1 ≤ n , a i ≤ 1 0 6 。
先给 a a a 排个序,排序后若 a i > i a_i>i a i > i ,则 a i a_i a i 一定要变少,不妨先取个 min \min min 提前算贡献。
令 a i a_i a i 在操作结束后变成 b i b_i b i ,那么 b i b_i b i 满足 b i ∈ { b i − 1 , b i − 1 + 1 } , b 0 = 0 b_i\in \{b_{i-1},b_{i-1}+1\},b_0=0 b i ∈ { b i − 1 , b i − 1 + 1 } , b 0 = 0 。
考虑逐个加入 a i a_i a i 求当 b i = x b_i=x b i = x 时的最小代价。
每次加入的代价都是个凸函数,故可以 slope trick。相当于每次将函数与函数向 x x x 轴正方向平移取极值,再插入一个绝对值函数。前者可以直接将斜率为 0 0 0 的段平移,后者就是插入点。
给出一个 n n n 个结点的树,每个结点有一个点权 0 0 0 或 1 1 1 ,每次可以把相邻两个权值相同的点点权翻转,已知初始状态和结束状态,求从初始状态到结束状态的最小操作次数,若达不到则次数为 0 0 0 。
不幸的是,初始和结束状态有的 0 , 1 0,1 0 , 1 变成了 ? ? ? ,即可以是 0 0 0 或 1 1 1 ,所以问题改为求所有情况的最小操作次数的和。1 ≤ n ≤ 1 0 5 1\le n\le 10^5 1 ≤ n ≤ 1 0 5 。
将两个相同的节点翻转看起来不好做,考虑转化。
注意到相邻的节点所在的深度奇偶性不同,于是可以把深度为奇数的点的点权翻转,这样一次操作就变成了交换两个点的点权。
考虑计算每条边的贡献,显然只要这条边断开形成的两个子树内的 1 1 1 达到结束状态的数量即可。
令 S 1 , S 2 , T 1 , T 2 S_1,S_2,T_1,T_2 S 1 , S 2 , T 1 , T 2 表示初始状态时整棵树的 1 , ? 1,? 1 , ? 的个数、结束状态时整棵树的 1 , ? 1,? 1 , ? 的个数。再令 s 1 , s 2 , t 1 , t 2 s_1,s_2,t_1,t_2 s 1 , s 2 , t 1 , t 2 表示边分成的较小的子树中的初始、结束状态时的 1 , ? 1,? 1 , ? 的个数。
那么有
a n s = ∑ ( u , v ) ∈ E ∑ d = 1 ∞ d [ ∑ i ( s 2 i − s 1 ) ( t 2 i − d − t 1 ) ] [ ∑ j ( S 2 − s 2 j − S 1 + s 1 ) ( T 2 − t 2 j + d − T 1 + t 1 ) ] + d [ ∑ i ( s 2 i − s 1 ) ( t 2 i + d − t 1 ) ] [ ∑ j ( S 2 − s 2 j − S 1 + s 1 ) ( T 2 − t 2 j − d − T 1 + t 1 ) ] ans=\sum_{(u,v)\in E}\sum_{d=1}^\infty d\bigg[\sum_{i}\binom{s_2}{i-s_1}\binom{t_2}{i-d-t_1}\bigg]\bigg[\sum_{j}\binom{S_2-s_2}{j-S_1+s_1}\binom{T_2-t_2}{j+d-T_1+t_1}\bigg]+d\bigg[\sum_{i}\binom{s_2}{i-s_1}\binom{t_2}{i+d-t_1}\bigg]\bigg[\sum_{j}\binom{S_2-s_2}{j-S_1+s_1}\binom{T_2-t_2}{j-d-T_1+t_1}\bigg] an s = ( u , v ) ∈ E ∑ d = 1 ∑ ∞ d [ i ∑ ( i − s 1 s 2 ) ( i − d − t 1 t 2 ) ] [ j ∑ ( j − S 1 + s 1 S 2 − s 2 ) ( j + d − T 1 + t 1 T 2 − t 2 ) ] + d [ i ∑ ( i − s 1 s 2 ) ( i + d − t 1 t 2 ) ] [ j ∑ ( j − S 1 + s 1 S 2 − s 2 ) ( j − d − T 1 + t 1 T 2 − t 2 ) ]
考虑求
s u m = ∑ d = 1 ∞ d [ ∑ i ( s 2 i − s 1 ) ( t 2 i − d − t 1 ) ] [ ∑ j ( S 2 − s 2 j − S 1 + s 1 ) ( T 2 − t 2 j + d − T 1 + t 1 ) ] sum=\sum_{d=1}^\infty d\bigg[\sum_{i}\binom{s_2}{i-s_1}\binom{t_2}{i-d-t_1}\bigg]\bigg[\sum_{j}\binom{S_2-s_2}{j-S_1+s_1}\binom{T_2-t_2}{j+d-T_1+t_1}\bigg] s u m = d = 1 ∑ ∞ d [ i ∑ ( i − s 1 s 2 ) ( i − d − t 1 t 2 ) ] [ j ∑ ( j − S 1 + s 1 S 2 − s 2 ) ( j + d − T 1 + t 1 T 2 − t 2 ) ]
= ∑ d = 1 ∞ d [ ∑ i ( s 2 s 2 + s 1 − i ) ( t 2 i − d − t 1 ) ] [ ∑ j ( S 2 − s 2 S 2 + S 1 − s 2 − s 1 − j ) ( T 2 − t 2 j + d − T 1 + t 1 ) ] =\sum_{d=1}^\infty d\bigg[\sum_{i}\binom{s_2}{s_2+s_1-i}\binom{t_2}{i-d-t_1}\bigg]\bigg[\sum_{j}\binom{S_2-s_2}{S_2+S_1-s_2-s_1-j}\binom{T_2-t_2}{j+d-T_1+t_1}\bigg] = d = 1 ∑ ∞ d [ i ∑ ( s 2 + s 1 − i s 2 ) ( i − d − t 1 t 2 ) ] [ j ∑ ( S 2 + S 1 − s 2 − s 1 − j S 2 − s 2 ) ( j + d − T 1 + t 1 T 2 − t 2 ) ]
最内层的 ∑ \sum ∑ 显然可以范德蒙德卷积:
s u m = ∑ d = 1 ∞ d ( s 2 + t 2 s 2 + s 1 − t 1 − d ) ( ( S 2 − s 2 ) + ( T 2 − t 2 ) ( S 2 − s 2 ) + ( S 1 − s 1 ) − ( T 1 − t 1 ) + d ) sum=\sum_{d=1}^\infty d\binom{s_2+t_2}{s_2+s_1-t_1-d}\binom{(S_2-s_2)+(T_2-t_2)}{(S_2-s_2)+(S_1-s_1)-(T_1-t_1)+d} s u m = d = 1 ∑ ∞ d ( s 2 + s 1 − t 1 − d s 2 + t 2 ) ( ( S 2 − s 2 ) + ( S 1 − s 1 ) − ( T 1 − t 1 ) + d ( S 2 − s 2 ) + ( T 2 − t 2 ) )
考虑到 d = s 2 + s 1 − t 1 − ( s 2 + s 1 − t 1 − d ) d=s_2+s_1-t_1-(s_2+s_1-t_1-d) d = s 2 + s 1 − t 1 − ( s 2 + s 1 − t 1 − d ) ,令 A = s 2 + t 2 , B = s 2 + s 1 − t 1 , x = B − d A=s_2+t_2,B=s_2+s_1-t_1,x=B-d A = s 2 + t 2 , B = s 2 + s 1 − t 1 , x = B − d ,则
s u m = ∑ d = 1 ∞ [ B − ( B − d ) ] ( A B − d ) ( S 2 + T 2 − A S 2 + S 1 − T 1 − ( B − d ) ) sum=\sum_{d=1}^\infty [B-(B-d)]\binom{A}{B-d}\binom{S_2+T_2-A}{S_2+S_1-T_1-(B-d)} s u m = d = 1 ∑ ∞ [ B − ( B − d )] ( B − d A ) ( S 2 + S 1 − T 1 − ( B − d ) S 2 + T 2 − A )
= B ∑ x = 0 B − 1 ( A x ) ( S 2 + T 2 − A S 2 + S 1 − T 1 − x ) − ∑ x = 0 B − 1 x ( A x ) ( S 2 + T 2 − A S 2 + S 1 − T 1 − x ) =B\sum_{x=0}^{B-1 }\binom{A}{x}\binom{S_2+T_2-A}{S_2+S_1-T_1-x}-\sum_{x=0}^{B-1}x\binom{A}{x}\binom{S_2+T_2-A}{S_2+S_1-T_1-x} = B x = 0 ∑ B − 1 ( x A ) ( S 2 + S 1 − T 1 − x S 2 + T 2 − A ) − x = 0 ∑ B − 1 x ( x A ) ( S 2 + S 1 − T 1 − x S 2 + T 2 − A )
= B ∑ x = 0 B − 1 ( A x ) ( S 2 + T 2 − A S 2 + S 1 − T 1 − x ) − A ∑ x = 0 B − 1 ( A − 1 x − 1 ) ( S 2 + T 2 − A S 2 + S 1 − T 1 − x ) =B\sum_{x=0}^{B-1 }\binom{A}{x}\binom{S_2+T_2-A}{S_2+S_1-T_1-x}-A\sum_{x=0}^{B-1}\binom{A-1}{x-1}\binom{S_2+T_2-A}{S_2+S_1-T_1-x} = B x = 0 ∑ B − 1 ( x A ) ( S 2 + S 1 − T 1 − x S 2 + T 2 − A ) − A x = 0 ∑ B − 1 ( x − 1 A − 1 ) ( S 2 + S 1 − T 1 − x S 2 + T 2 − A )
= B ∑ x = 0 B − 1 ( A x ) ( S 2 + T 2 − A S 2 + S 1 − T 1 − x ) − A ∑ x = 0 B − 2 ( A − 1 x ) ( S 2 + T 2 − A S 2 + S 1 − T 1 − 1 − x ) =B\sum_{x=0}^{B-1 }\binom{A}{x}\binom{S_2+T_2-A}{S_2+S_1-T_1-x}-A\sum_{x=0}^{B-2}\binom{A-1}{x}\binom{S_2+T_2-A}{S_2+S_1-T_1-1-x} = B x = 0 ∑ B − 1 ( x A ) ( S 2 + S 1 − T 1 − x S 2 + T 2 − A ) − A x = 0 ∑ B − 2 ( x A − 1 ) ( S 2 + S 1 − T 1 − 1 − x S 2 + T 2 − A )
设函数 f ( P , Q , S , T ) f(P,Q,S,T) f ( P , Q , S , T ) 表示 ∑ x = 0 Q ( P x ) ( S − P T − x ) \sum_{x=0}^{Q }\binom{P}{x}\binom{S-P}{T-x} ∑ x = 0 Q ( x P ) ( T − x S − P ) 。
那么 s u m = B × f ( A , B − 1 , S 2 + T 2 , S 2 + S 1 − T 1 ) − A × f ( A − 1 , B − 2 , S 2 + T 2 − 1 , S 2 + S 1 − T 1 − 1 ) sum=B\times f(A,B-1,S_2+T_2,S_2+S_1-T_1)-A\times f(A-1,B-2,S_2+T_2-1,S_2+S_1-T_1-1) s u m = B × f ( A , B − 1 , S 2 + T 2 , S 2 + S 1 − T 1 ) − A × f ( A − 1 , B − 2 , S 2 + T 2 − 1 , S 2 + S 1 − T 1 − 1 ) 。
当沿着树计算边的贡献时 A , B A,B A , B 的变化是 O ( 1 ) O(1) O ( 1 ) 的故考虑求 f f f 的递推式。
Q Q Q 的变化是显然的:
f ( P , Q + 1 , S , T ) ← f ( P , Q , S , T ) + ( P Q + 1 ) ( S − P T − Q − 1 ) f(P,Q+1,S,T)\leftarrow f(P,Q,S,T)+\binom{P}{Q+1}\binom{S-P}{T-Q-1} f ( P , Q + 1 , S , T ) ← f ( P , Q , S , T ) + ( Q + 1 P ) ( T − Q − 1 S − P )
f ( P , Q − 1 , S , T ) ← f ( P , Q , S , T ) − ( P Q ) ( S − P T − Q ) f(P,Q-1,S,T)\leftarrow f(P,Q,S,T)-\binom{P}{Q}\binom{S-P}{T-Q} f ( P , Q − 1 , S , T ) ← f ( P , Q , S , T ) − ( Q P ) ( T − Q S − P )
对于 P P P ,考虑用加法原理分解:
( P x ) ( S − P T − x ) = ( P x ) [ ( S − P − 1 T − x ) + ( S − P − 1 T − 1 − x ) ] \binom{P}{x}\binom{S-P}{T-x}=\binom{P}{x}\bigg[\binom{S-P-1}{T-x}+\binom{S-P-1}{T-1-x}\bigg] ( x P ) ( T − x S − P ) = ( x P ) [ ( T − x S − P − 1 ) + ( T − 1 − x S − P − 1 ) ]
( P + 1 x ) ( S − P − 1 T − x ) = [ ( P x ) + ( P x − 1 ) ] ( S − P − 1 T − x ) \binom{P+1}{x}\binom{S-P-1}{T-x}=\bigg[\binom{P}{x}+\binom{P}{x-1}\bigg]\binom{S-P-1}{T-x} ( x P + 1 ) ( T − x S − P − 1 ) = [ ( x P ) + ( x − 1 P ) ] ( T − x S − P − 1 )
作差再求和可得:
f ( P + 1 , Q , S , T ) ← f ( P , Q , S , T ) − ( P Q ) ( S − P − 1 T − Q − 1 ) f(P+1,Q,S,T)\leftarrow f(P,Q,S,T)-\binom{P}{Q}\binom{S-P-1}{T-Q-1} f ( P + 1 , Q , S , T ) ← f ( P , Q , S , T ) − ( Q P ) ( T − Q − 1 S − P − 1 )
f ( P − 1 , Q , S , T ) ← f ( P , Q , S , T ) + ( P − 1 Q ) ( S − P T − Q − 1 ) f(P-1,Q,S,T)\leftarrow f(P,Q,S,T)+\binom{P-1}{Q}\binom{S-P}{T-Q-1} f ( P − 1 , Q , S , T ) ← f ( P , Q , S , T ) + ( Q P − 1 ) ( T − Q − 1 S − P )
于是就做完了,注意边界的处理。
交互题。有一张 n n n 个点 m m m 条边的无向图,可能有重边或自环,要求求出这张图所有的边。每次可以询问一个数列 a 1 , a 2 , . . . , a k ( 1 ≤ a i ≤ n ) a_1,a_2,...,a_k(1\le a_i\le n) a 1 , a 2 , ... , a k ( 1 ≤ a i ≤ n ) ,k k k 每次由自己决定。每次询问后,交互库会开一个空集 S S S ,和一个长度为 k k k 的数组 c n t 1 , c n t 2 , . . . , c n t k cnt_1,cnt_2,...,cnt_k c n t 1 , c n t 2 , ... , c n t k ,并将该数组初始化为 0 0 0 。然后进行如下操作:
1.将 a 1 a_1 a 1 放入集合 S S S 。
2.枚举 i ∈ [ 2 , n ] i\in[2,n] i ∈ [ 2 , n ] ,扫描图中 a i a_i a i 的所有边 ( a i , j ) (a_i,j) ( a i , j ) ,若 j ∈ S j\in S j ∈ S ,则令 c n t i cnt_i c n t i 加 1 1 1 ;若扫描完所有边后 c n t i cnt_i c n t i 等于 0 0 0 ,则将 a i a_i a i 加入 S S S 。
3.返回 c n t cnt c n t 数组。
1 ≤ n ≤ 4000 , 0 ≤ m ≤ 10000 1\le n\le 4000,0\le m\le 10000 1 ≤ n ≤ 4000 , 0 ≤ m ≤ 10000 ,询问的 k k k 的和不超过 176000 176000 176000 。
先求自环,可以通过问自己两次得到。
然后先把 1 ∼ n 1\sim n 1 ∼ n 放在一起问一遍,这个就得到了一个独立集 S 1 S_1 S 1 和另一个集合 S 2 S_2 S 2 。S 2 S_2 S 2 内部的边可以递归求解,故只需考虑 S 1 S_1 S 1 与 S 2 S_2 S 2 之间的边,这样就可以分治,把 S 1 S_1 S 1 分成左右两半,往有边的一半分治,就可以把求出一条边的花费变为对数级。
Petrozavodsk Winter 2023. Day 2: GP of ainta
Link \text{Link} Link
数轴上有 n n n 个点,第 i i i 个点的坐标为 i i i ,每个点有一个颜色,总共 m m m 种颜色,你要构造一个选若干个不同线段的方案,使其满足以下条件并且数量最多:
线段的两个端点为 1 1 1 到 n n n 的整数,且端点的颜色不同。
任意两条线段要么相离要么包含,不能相交(端点重合不算相交)。
2 ≤ m ≤ n ≤ 2 × 1 0 5 2\le m\le n\le 2\times 10^5 2 ≤ m ≤ n ≤ 2 × 1 0 5 。
对于这种端点可交线段的问题,可以采用经典的化直为圆,即将线段当成 1 ∼ n 1\sim n 1 ∼ n 构成的环上的弦。这样题目就转化为不相交弦的最大数量。
对于相邻的颜色不同的点,可以先把他们记入答案,这样接下来取的弦只能是多边形的对角线,同时随着其他弦的加入,他们也可以成为多边形的新边。另外,这个转化也告诉了我们答案的上界,由于从一个点出发,多边形的对角线条数为 n − 3 n-3 n − 3 ,故答案不超过 2 n − 3 2n-3 2 n − 3 。
接下来考虑从多边形中取一段来分析不能使答案变劣的操作(下文 A,B,C \texttt{A,B,C} A,B,C 均为颜色)。
ABB...BB ⇒ AB \texttt{ABB...BB}\Rightarrow \texttt{AB} ABB...BB ⇒ AB :考虑逐次把 A \texttt{A} A 旁边的 B \texttt{B} B 扔掉,即与隔一个的 B \texttt{B} B 连边。
这种操作相当于把连续段变成一个单点,可让图变成不同颜色交替的圆。
若存在一种颜色,使其只出现了一次,那么可以从该点出发,依次取弦,得到最优答案。
正确性显然。
将连续段改成单点后,若出现唯一颜色点,则可按上面的做法做,若没有,考虑将 ABC \texttt{ABC} ABC 变成 AC \texttt{AC} AC ,就能变成上面的情况。然而,当且仅当出现至少 3 3 3 种颜色才能这么构造,特殊情况便是形如 ABABABABAB \texttt{ABABABABAB} ABABABABAB 之类的环,这种也很好处理,将第一个 A \texttt{A} A 与不相邻的 B \texttt{B} B 连边即可。
Petrozavodsk Winter 2023. Day 4: KAIST+KOI Contest, Grand Prix of Korea
Link \text{Link} Link
给出一棵 n n n 个节点的树,边带权,定义一张图的权值为任意两点之间最短路的最大值,不连通的两点的最短路长度定义为 0 0 0 。对于每个 i ∈ [ 0 , k ] i\in[0,k] i ∈ [ 0 , k ] ,你可以恰好执行 i i i 次操作,每次操作可以切断一条边,并给当前的图加上一条与切断的边权值相同的边,没必要保证操作后图仍为一棵树。对于每个 i i i ,求出操作后能得到的图的权重的最大值。
2 ≤ n ≤ 2000 , 0 ≤ k ≤ 2000 2\le n\le 2000,0\le k\le 2000 2 ≤ n ≤ 2000 , 0 ≤ k ≤ 2000 。
显然操作完后仍然是树答案不会更劣,因此一次操作的实质是将树分成两部分,再把这两部分连接。一棵树的权重显然是其直径,所以执行 x x x 次操作相当于选出 x x x 条边,答案为这 x x x 条边的边权和他们划分出的子树的直径之和。
考虑 d p dp d p ,设 f u , i , 0 / 1 / 2 f_{u,i,0/1/2} f u , i , 0/1/2 表示在 u u u 的子树内执行 i i i 次操作的答案,状态 0 0 0 表示选出了一条向上的链,1 1 1 表示已经凑出了一条直径,2 2 2 表示在 1 1 1 的基础上选了一条边,大力树形 d p dp d p 即可。
Petrozavodsk Winter 2023. Day 6: Um_nik mod 998 244 353 Contest
Link \text{Link} Link
给出一张 n n n 个点 m m m 条边的简单无向图,求阶为 4 4 4 的完全子图数量。
4 ≤ n ≤ 1 0 5 , 0 ≤ m ≤ 1 0 5 4\le n\le 10^5,0\le m\le 10^5 4 ≤ n ≤ 1 0 5 , 0 ≤ m ≤ 1 0 5 。
类似三元环计数,我们将度数小的点向度数大的点连边,最终形成一个 D A G DAG D A G ,枚举点 a a a 及其指向的点 B B B ,再枚举点 B B B 指向的点 C C C ,若 A , C A,C A , C 间有边,则称边 ( A , C ) (A,C) ( A , C ) 是点 B B B 的一条对边。我们给每条边标号,对每个点的对边建立集合 S ( B ) S(B) S ( B ) 。对于原图中的每条边 ( B , D ) (B,D) ( B , D ) ,所有 ∣ S ( B ) ∩ S ( D ) ∣ |S(B)\cap S(D)| ∣ S ( B ) ∩ S ( D ) ∣ 的和记为答案,可用 b i t s e t bitset bi t se t 维护。
时间复杂度 O ( m m + n m w ) O(m\sqrt m+\frac{nm}{w}) O ( m m + w nm ) 。