2023 年牛客多校第一场题解(上)

A Almost Correct

题意:给定长度为 n n n 01 01 01 s s s,构造一个排序网络,使得能够将除 s s s 之外的任意 01 01 01 序列正确排序,且 s s s 无法被正确排序。 T T T 组测试, 1 ≤ T ≤ 1 0 4 1 \le T \le 10^4 1T104 2 ≤ n ≤ 16 2 \le n \le 16 2n16

解法:记 01 01 01 s s s 0 0 0 所在位置的下标集合为 S 0 S_0 S0 1 1 1 所在位置的下标集合为 S 1 S_1 S1(下标从 1 1 1 开始)。令 S 0 S_0 S0 中最大值为 r r r S 1 S_1 S1 中最小值为 l l l(显然 l ≤ ∣ S 0 ∣ < r l\le |S_0|lS0<r,因为 s s s 没被排好序)。下简写一次操作为 ( x , y ) (x,y) (x,y) 表示对 a x a_x ax a y a_y ay 的比较与交换。对 01 01 01 序列 t t t 排序方法如下:

  • S 0 S_0 S0 中最大值挪到最右边, S 1 S_1 S1 中最小值挪到最左边,即执行 ∀ x ∈ S 0 , ( x , r ) \forall x \in S_0,(x,r) xS0,(x,r) ∀ x ∈ S 1 , ( l , x ) \forall x \in S_1, (l,x) xS1,(l,x)
  • { 1 , 2 , 3 , ⋯   , n } − { l , r } = { 1 , 2 , ⋯ l − 1 , l + 1 , ⋯   , r − 1 , r + 1 , ⋯   , n } \{1,2,3,\cdots,n\}-\{l,r\}=\{1,2,\cdots l-1,l+1,\cdots,r-1,r+1,\cdots,n\} {1,2,3,,n}{l,r}={1,2,l1,l+1,,r1,r+1,,n} 正常排序,即去掉下标 l , r l,r l,r 对其他元素排序。
  • 依次执行 ( r , ∣ S 0 ∣ + 1 ) , ( r , ∣ S 0 ∣ + 2 ) , … , ( r , r − 1 ) , ( r , n ) , ( r , n − 1 ) , … , ( r , r + 1 ) (r,{|S_0|+1}),(r,{|S_0|+2}),\dots,(r,{r-1}),(r,n),(r,{n-1}),\dots, (r,{r+1}) (r,S0+1),(r,S0+2),,(r,r1),(r,n),(r,n1),,(r,r+1) ( l , ∣ S 0 ∣ ) , ( l , ∣ S 0 ∣ − 1 ) , ⋯   , ( l , l + 1 ) , ( l , 1 ) , ( l , 2 ) , ⋯   , ( l , l − 1 ) (l,|S_0|),(l,|S_0|-1),\cdots,(l,l+1),(l,1),(l,2),\cdots,(l,l-1) (l,S0),(l,S01),,(l,l+1),(l,1),(l,2),,(l,l1)

t t t 0 0 0 所在位置的下标集合为 T 0 T_0 T0 1 1 1 所在位置的下标集合为 T 1 T_1 T1。上面的算法满足题目要求,证明如下:

  • t = s t=s t=s,第一步结束后 t l = 1 t_l=1 tl=1 t r = 0 t_r=0 tr=0,显然第一步无效。第二步中 t l t_l tl t r t_r tr 显然不变,其他元素已经排好序了。第三步只能将 t l t_l tl 交换到 t ∣ S 0 ∣ t_{|S_0|} tS0,将 t r t_r tr 交换到 t ∣ S 0 ∣ + 1 t_{|S_0|+1} tS0+1,因此排序后 t t t 形如 0 … 001011 … 1 0\dots 001011\dots 1 00010111,在零一分界线 ∣ S 0 ∣ |S_0| S0 处恰有一对 10 10 10,因而未被正确排序;
  • ∣ T 0 ∣ ≥ ∣ S 0 ∣ |T_0|\ge |S_0| T0S0 t ≠ s t\neq s t=s S 1 S_1 S1 中一定存在一个 0 0 0,因此经过第一步操作后 t l = 0 t_l=0 tl=0,第二步操作后 ∣ S 0 ∣ |S_0| S0 及其左边全为 0 0 0。第三步操作中,若 t r = 0 t_r=0 tr=0,则 t r t_r tr 会被交换到 t ∣ S 0 ∣ + 1 t_{|S_0|+1} tS0+1;若 t r = 1 t_r=1 tr=1,则会被交换到 t n t_n tn。由于 t ∣ S 0 ∣ + 1 : r − 1 t r + 1 : n t_{|S_0|+1:r-1}t_{r+1:n} tS0+1:r1tr+1:n 在第二步时已经排好序,因此交换后 t ∣ S 0 ∣ + 1 : n t_{|S_0|+1:n} tS0+1:n 有序,于是整个序列 t t t 有序;
  • ∣ T 0 ∣ < ∣ S 0 ∣ |T_0|<|S_0| T0<S0 时同理。

B Anticomplementary Triangle

题意:平面上给一个 n n n 个点的凸多边形 P 1 P 2 … , P n P_1P_2\dots,P_n P1P2,Pn,要求找到 3 3 3 个点,使得这三个点构成的三角形的反互补三角形包含所有点(可以在边界上)。 1 ≤ n ≤ 1 0 6 1 \le n \le 10^6 1n106

解法:乱搞题,目标是找到一个三角形使得面积极大。有很多不知道对不对但是能过的搞法,一种能证明的做法如下:

  • 固定 r = 1 r=1 r=1,找到两个点 P s , P t   ( 1 < s < t ≤ n ) P_s,P_t\ (1Ps,Pt (1<s<tn) 使得 S △ P r P s P t S_{\triangle P_rP_sP_t} SPrPsPt 最大;
  • 尝试向左或者向右挪动 P r P_r Pr,哪边能让 S △ P r P s P t S_{\triangle P_rP_sP_t} SPrPsPt 变大就往哪边挪。 P r P_r Pr 挪到极大值后挪 P t P_t Pt P t P_t Pt 挪到极大值后挪 P s P_s Ps P s P_s Ps 挪到极大值后挪 P r P_r Pr,直到没有一个点能动。

在第一步结束后,只有 r r r 能够移动。假设 r r r 逆时针移动,这之后 r , s , t r,s,t r,s,t 就只能逆时针移动,并且 r , s , t r,s,t r,s,t 中任何一个点无法重新移动到 P 1 P_1 P1,因为 S △ P r P s P t S_{\triangle P_rP_sP_t} SPrPsPt 在移动过程中递增,并且第一步得到的 S △ P 1 P s P t S_{\triangle P_1P_sP_t} SP1PsPt 已经是最大的。因此时间复杂度不超过 O ( n ) O(n) O(n)

C Carrot Trees

题意:给一个长为 n n n 的序列,初始状态全为 0 0 0。有两种操作,第一种将区间 [ l , r ] [l,r] [l,r] 内的数均增加 x x x,第二种对区间 [ l , r ] [l,r] [l,r] 内的每个数如果大于或等于 k k k 就减去 k k k k k k 在所有操作中相等)。你需要执行 m m m 次操作,输出执行完所有操作后所有数一共被减了多少次。 1 ≤ n ≤ 1 0 6 1 \le n \le 10^6 1n106 1 ≤ m ≤ 2 × 1 0 5 1 \le m \le 2\times 10^5 1m2×105 1 ≤ x , k ≤ 1 0 9 1 \le x,k \le 10^9 1x,k109

解法:考虑某个位置上的数。将第 i i i 次操作后的数表示成 a i = c i + k ⋅ b i a_i=c_i+k\cdot b_i ai=ci+kbi 的形式( b 0 = c 0 = 0 b_0=c_0=0 b0=c0=0),其中 b i b_i bi 代表了借位操作次数。考虑如下的一个暴力算法:对于操作一,直接令 c i + 1 = c i + x c_{i+1}= c_i+x ci+1=ci+x。对于操作二,若 a i ≥ k a_i\ge k aik(即 c i + k b i ≥ k ⇒ c i − k ≥ − k   b i c_i+kb_i \ge k \Rightarrow c_i-k\ge -k\,b_i ci+kbikcikkbi),则令 c i + 1 = c i − k c_{i+1}= c_i-k ci+1=cik;否则令 c i + 1 = c i − k c_{i+1}= c_i-k ci+1=cik b i + 1 = b i + 1 b_{i+1}= b_i+1 bi+1=bi+1

引理:使用上述算法计算,所有操作后 b m = ⌈ − min ⁡ i c i k ⌉ b_m= \left \lceil -\dfrac{\min_{i}c_i}{k}\right\rceil bm=kminici

证明:经过一次操作一, c i + 1 ≥ c i c_{i+1} \ge c_i ci+1ci,则 min ⁡ 1 ≤ j ≤ i c j = min ⁡ 1 ≤ j ≤ i + 1 c j \min_{1 \le j \le i} c_j =\min_{1 \le j \le i+1}c_j min1jicj=min1ji+1cj,因而 b i = b i + 1 b_{i}=b_{i+1} bi=bi+1,与上述算法执行过程相同。考虑操作二的两种情况:

  1. a i ≥ k a_i \ge k aik 时,有 c i + 1 = c i − k ≥ − k b i c_{i+1}=c_i-k \ge -kb_i ci+1=cikkbi,因而 b i + 1 = b i ≥ − c i k + 1 ≥ ⌈ − c i k ⌉ b_{i+1}=b_i \ge -\dfrac{c_i}{k}+1 \ge \left \lceil -\dfrac{c_i}{k} \right \rceil bi+1=bikci+1kci。显然 c i + 1 < c i c_{i+1} ci+1<ci,由数学归纳法可得若 b i = ⌈ max ⁡ 0 ≤ j ≤ i ( − c j ) k ⌉ b_i=\left \lceil \dfrac{\max_{0 \le j \le i} (-c_j)}{k} \right \rceil bi=kmax0ji(cj) 成立则 b i + 1 = ⌈ max ⁡ 0 ≤ j ≤ i + 1 ( − c j ) k ⌉ b_{i+1}=\left \lceil \dfrac{\max_{0 \le j \le i+1} (-c_j)}{k} \right \rceil bi+1=kmax0ji+1(cj) 成立,即 b i + 1 = ⌈ − min ⁡ j c j k ⌉ b_{i+1}=\left \lceil -\dfrac{\min_{j}c_j}{k}\right\rceil bi+1=kminjcj
  2. a i < k a_i ai<k 时, 0 ≤ c i + k b i < k 0 \le c_i+kb_i0ci+kbi<k 可得 c i ≥ − k b i c_i \ge -kb_i cikbi。由此时的操作 b i + 1 = b i + 1 b_{i+1}=b_i+1 bi+1=bi+1 可得 c i ≥ − k − k b i + 1 c_i \ge -k-kb_{i+1} cikkbi+1,则与第一种情况证明方法相同。

由该引理可知,因此 a i a_i ai 减少的次数一共为 t − b m = t + min ⁡ i ⌊ c i k ⌋ t-b_m=t+\min_i \left \lfloor \dfrac{c_i}{k} \right\rfloor tbm=t+minikci(其中 t t t 为操作二的次数)。

因而本题转化为转化为区间加、单点查询历史最小值,可以参看https://oi-wiki.org/ds/seg-beats/的处理方法,或者使用线段树分治的思想。总时间复杂度 O ( n log ⁡ m ) O(n\log m) O(nlogm)

D Chocolate

题意:有一个 n × m n\times m n×m 的网格,每格放了块巧克力。Walk Alone(懵哥)和 Kelin 轮流吃巧克力,Kelin 先吃。每轮一个人能选择一个左下角为 ( 1 , 1 ) (1,1) (1,1) 的子矩形,把里面的巧克力吃光,且至少要吃一个。吃到最后一个巧克力的人输。问懵哥和 Kelin 谁赢。 T T T 组测试数据, 1 ≤ T ≤ 1 0 5 1 \le T \le 10^5 1T105 1 ≤ n , m ≤ 1 0 9 1 \le n,m \le 10^9 1n,m109

解法:当 n = m = 1 n=m=1 n=m=1 显然懵哥赢。当 n > 1 n>1 n>1 m > 1 m>1 m>1,假设 Kelin 第一步吃 ( 1 , 1 ) (1,1) (1,1) 并且懵哥赢了,那么 Kelin 可以抢先走懵哥的必胜态且不改变局面(因为 ( 1 , 1 ) (1,1) (1,1) 被任意子矩形包含),因此 Kelin 必胜。

E Heap

题意:给定一个以 1 1 1 为根的有根树,点个数为 n n n,每个点有点权 a i a_i ai。现要求给每个点重新赋点权 b i b_i bi,且要求 b p i ≤ b i b_{p_i} \le b_i bpibi,其中 p i p_i pi i i i 的父亲。输出最小的 ∑ i = 1 n ( a i − b i ) 2 \displaystyle \sum_{i=1}^n (a_i-b_i)^2 i=1n(aibi)2 1 ≤ n ≤ 2 × 1 0 5 1 \le n \le 2\times 10^5 1n2×105 0 ≤ a i ≤ 1 0 9 0 \le a_i \le 10^9 0ai109

解法:本题主要使用到了 Slope Trick 的方法。

首先我们研究一个简单一些的题目,并从该弱化版的题目中得到本题真正的做法。

弱化版题目:给定一个以 1 1 1 为根的有根树,点个数为 n n n,每个点有点权 a i a_i ai。现要求给每个点重新赋点权 b i b_i bi,且要求 b p i ≤ b i b_{p_i} \le b_i bpibi,其中 p i p_i pi i i i 的父亲。输出最小的 ∑ i = 1 n ∣ a i − b i ∣ \displaystyle \sum_{i=1}^n |a_i-b_i| i=1naibi 1 ≤ n ≤ 2 × 1 0 5 1 \le n \le 2\times 10^5 1n2×105 0 ≤ a i ≤ 1 0 9 0 \le a_i \le 10^9 0ai109

g u ( x ) g_u(x) gu(x) 表示保证以 u u u 为根的子树满足所有父节点权值小于等于子节点,并且使得 u u u 的权值恰好 x x x 的最小代价; f u ( x ) f_u(x) fu(x) 表示使得 u u u 的权值至少 x x x 的最小代价,即 f u ( x ) = min ⁡ y ≥ x g u ( y ) f_u(x)=\min_{y\ge x} g_u(y) fu(x)=minyxgu(y)。可以得到以下转移:
g u ( x ) = ∣ x − a u ∣ + ∑ v ∈ son u f v ( x ) g_u(x)=|x-a_u|+\sum_{v\in \text{son}_u}f_v(x) gu(x)=xau+vsonufv(x)
首先需要证明引理 1:

f u ( x ) f_u(x) fu(x) 是一个可导且单调递增的函数,且形如 f u ( x ) = c u + ∑ i ∈ S u r ( x − i ) \displaystyle f_u(x)=c_u+\sum_{i\in S_u} r(x-i) fu(x)=cu+iSur(xi),其中:

  1. r ( x − a u ) = R e L U ( x − a u ) = ( x − a u ) [ x ≥ a u ] r(x-a_u)={\rm ReLU}(x-a_u)=(x-a_u)[x \ge a_u] r(xau)=ReLU(xau)=(xau)[xau],其中 [ x ≥ a u ] [x \ge a_u] [xau] 为艾弗森括号,表示当 x ≥ a u x \ge a_u xau 时值为 1 1 1,反之为 0 0 0
  2. S u S_u Su u u u 节点子树中全部 a u a_u au 构成的可重集合。
  3. c u c_u cu 为一确定常数。

证明:递增性显然成立,下面使用数学归纳法证明该结论。

首先我们考虑叶节点 g u ( x ) g_u(x) gu(x) f u ( x ) f_u(x) fu(x) 的形式—— g u ( x ) = ∣ x − a u ∣ g_u(x)=|x-a_u| gu(x)=xau f u ( x ) = r ( x − a u ) = ( x − a u ) [ x ≥ a u ] f_u(x)=r(x-a_u)=(x-a_u)[x \ge a_u] fu(x)=r(xau)=(xau)[xau],因而 f u ( x ) f_u(x) fu(x) 是一个单调递增且可导的函数,且符合归纳形式。
注: R e L U {\rm ReLU} ReLU 函数在 x = 0 x=0 x=0 处严格意义上不可导,但是为方便后文的表述,不妨定义 r ′ ( 0 + ) = 1 r'(0^+)=1 r(0+)=1

对其余非叶节点, g u ( x ) = ∣ x − a u ∣ + ∑ v ∈ son u f v ( x ) \displaystyle g_u(x)=|x-a_u|+\sum_{v\in \text{son}_u}f_v(x) gu(x)=xau+vsonufv(x)。由可导函数相加还是可导函数, g u ( x ) g_u(x) gu(x) 也同样可导,且 c u + ∑ i ∈ S u r ( x − i ) \displaystyle c_u+\sum_{i\in S_u} r(x-i) cu+iSur(xi) 形式具有可加性。对其做后缀 m i n \rm min min 操作,则 ∣ x − a u ∣ → r ( x − a u ) |x-a_u| \to r(x-a_u) xaur(xau),因而 f u ( x ) f_u(x) fu(x) 同样符合原形式。归纳得证。

考虑将 f u ( x ) = c u + ∑ i ∈ S u r ( x − i ) \displaystyle f_u(x)=c_u+\sum_{i\in S_u} r(x-i) fu(x)=cu+iSur(xi) 带入原转移式:
g u ( x ) = ∣ x − a u ∣ + ∑ v ∈ s o n u c v + ∑ v ∈ s o n u ∑ i ∈ S v r ( x − i ) = ( − x + a u + 2 r ( x − a u ) ) + ∑ v ∈ s o n u c v + ∑ v ∈ s o n u ∑ i ∈ S v r ( x − i ) = − x + a u + ∑ v ∈ s o n u c v + ∑ i ∈ S u ′ r ( x − i ) \begin{aligned} g_u(x)&=|x-a_u|+\sum_{v\in{\rm son}_u}c_v+\sum_{v\in{\rm son}_u}\sum_{i\in S_v}r(x-i) \\[3pt] &=(-x+a_u+2r(x-a_u))+\sum_{v\in{\rm son}_u}c_v+\sum_{v\in{\rm son}_u}\sum_{i\in S_v}r(x-i) \\[3pt] &=-x+a_u+\sum_{v\in{\rm son}_u}c_v+\sum_{i\in S_u'}r(x-i) \end{aligned} gu(x)=xau+vsonucv+vsonuiSvr(xi)=(x+au+2r(xau))+vsonucv+vsonuiSvr(xi)=x+au+vsonucv+iSur(xi)
其中 S u ′ = ⋃ v ∈ s o n u S v ∪ { a u , a u } S_u'=\bigcup_{v\in{\rm son}_u}S_v\cup\{a_u,a_u\} Su=vsonuSv{au,au}。不妨对 g u ( x ) g_u(x) gu(x) 求导,当导函数第一次大于等于 0 0 0 时, x = min ⁡ S u ′ x=\min S_u' x=minSu。令 x 0 = min ⁡ S u ′ x_0=\min S_u' x0=minSu,当 x = x 0 x=x_0 x=x0 g u ( x ) g_u(x) gu(x) 取到最小值 a u − x 0 + ∑ v ∈ s o n u c v \displaystyle a_u-x_0+\sum_{v\in{\rm son}_u}c_v aux0+vsonucv,因此令
S u = S u ′ − { x 0 } c u = a u − x 0 + ∑ v ∈ s o n u c v \begin{aligned} S_u &= S_u'-\{x_0\} \\[3pt] c_u &= a_u-x_0+\sum_{v\in{\rm son}_u}c_v \end{aligned} Sucu=Su{x0}=aux0+vsonucv
x ≥ x 0 x\ge x_0 xx0 时有
f u ( x ) = g u ( x ) = − x + x 0 + c u + ∑ i ∈ S u ′ r ( x − i ) = r ( x − x 0 ) − x + x 0 + c u + ∑ i ∈ S u r ( x − i ) = c u + ∑ i ∈ S u r ( x − i ) \begin{aligned} f_u(x)&=g_u(x) \\[3pt] &=-x+x_0+c_u+\sum_{i\in S_u'}r(x-i) \\[3pt] &=r(x-x_0)-x+x_0+c_u+\sum_{i\in S_u}r(x-i) \\[3pt] &=c_u+\sum_{i\in S_u}r(x-i) \end{aligned} fu(x)=gu(x)=x+x0+cu+iSur(xi)=r(xx0)x+x0+cu+iSur(xi)=cu+iSur(xi)
x < x 0 xx<x0 时,由于 f u ( x ) f_u(x) fu(x) g u ( x ) g_u(x) gu(x) 的后缀 min ⁡ \min min,因而
f u ( x ) ≡ c u + ∑ i ∈ S u r ( x − i ) = c u f_u(x)\equiv c_u+\sum_{i\in S_u}r(x-i)=c_u fu(x)cu+iSur(xi)=cu
用优先队列维护 S u S_u Su 做启发式合并可以做到 O ( n log ⁡ 2 n ) O(n\log^2n) O(nlog2n)

接下来我们回到原问题,即目标函数为平方代价。

g u ( x ) g_u(x) gu(x) 表示保证以 u u u 为根的子树满足所有父节点权值小于等于子节点,并且使得 u u u 的权值恰好 x x x 的最小代价; f u ( x ) f_u(x) fu(x) 表示使得 u u u 的权值至少 x x x 的最小代价,即 f u ( x ) = min ⁡ y ≥ x g u ( y ) f_u(x)=\min_{y\ge x} g_u(y) fu(x)=minyxgu(y)。可以得到以下转移:
g u ( x ) = ( x − a u ) 2 + ∑ v ∈ son u f v ( x ) g_u(x)=(x-a_u)^2+\sum_{v\in \text{son}_u}f_v(x) gu(x)=(xau)2+vsonufv(x)

用上面同样的方法,可以得到

f u ( x ) = c u + ∑ i ∈ S u ( x − i ) 2 [ x ≥ i ] f_u(x)=c_u+\sum_{i \in S_u}(x-i)^2[x \ge i] fu(x)=cu+iSu(xi)2[xi]

其中 S u S_u Su 仅为关于 u u u 的集合。这时形式较为复杂,对其做后缀 min ⁡ \min min 操作难度较大。但是我们可以研究它的导函数以研究它的极小值情况。对转移式两边求导有
g u ′ ( x ) = 2 ( x − a u ) + ∑ v ∈ s o n u f v ′ ( x ) g'_u(x)=2(x-a_u)+\sum_{v\in{\rm son}_u}f'_v(x) gu(x)=2(xau)+vsonufv(x)
其中 son u \text{son}_u sonu 表示 u u u 的儿子集合。根据上面同样的方法,显然 f u ( x ) f_u(x) fu(x) 是一个连续、递增、下凸的分段函数,因此 f u ′ ( x ) ≥ 0 f'_u(x)\ge 0 fu(x)0,且由 f u ( x ) = min ⁡ y ≥ x g u ( y ) f_u(x)=\min_{y\ge x} g_u(y) fu(x)=minyxgu(y) 可得

f u ′ ( x ) = max ⁡ { g u ′ ( x ) , 0 } f'_u(x)=\max\{g'_u(x),0\} fu(x)=max{gu(x),0}
用可重集合 S u ⊆ R × N S_u\subseteq\R\times \N SuR×N 维护 f u ′ ( x ) f'_u(x) fu(x) 的所有拐点以及拐点两侧的斜率差。下用同样的方法证明 f u ′ ( x ) = ∑ ( i , δ ) ∈ S u δ ⋅ R e L U ( x − i ) \displaystyle f'_u(x)=\sum_{(i,\delta)\in S_u} \delta\cdot {\rm ReLU}(x-i) fu(x)=(i,δ)SuδReLU(xi)

证明:同样引入 r ( x ) = x ⋅ [ x > 0 ] r(x)=x\cdot[x>0] r(x)=x[x>0],假设 u u u 的所有儿子节点 f v ′ ( x ) f'_v(x) fv(x) 都能表示成以下形式:

f v ′ ( x ) = ∑ ( i , δ ) ∈ S v δ ⋅ r ( x − i ) f'_v(x)=\sum_{(i,\delta)\in S_v} \delta\cdot r(x-i) fv(x)=(i,δ)Svδr(xi)
代入 g u ′ ( x ) g'_u(x) gu(x) 的转移式可得
g u ′ ( x ) = 2 ( x − a u ) + ∑ v ∈ s o n u ∑ ( i , δ ) ∈ S v δ ⋅ r ( x − i ) = − 2 a u + 2 x + ∑ ( i , δ ) ∈ S u ′ δ ⋅ r ( x − i ) \begin{aligned} g'_u(x)&= 2(x-a_u)+\sum_{v\in{\rm son}_u}\sum_{(i,\delta)\in S_v}\delta\cdot r(x-i) \\[3pt] &= -2a_u+2x+\sum_{(i,\delta)\in S'_u}\delta\cdot r(x-i) \end{aligned} gu(x)=2(xau)+vsonu(i,δ)Svδr(xi)=2au+2x+(i,δ)Suδr(xi)
其中 S u ′ = ⋃ v ∈ s o n u S v S_u'=\bigcup_{v\in{\rm son}_u}S_v Su=vsonuSv。显然 g u ′ ( x ) g'_u(x) gu(x) 单调递增,且存在唯一零点 x 0 x_0 x0。考虑由于求后缀 min ⁡ \min min 使得 x 0 x_0 x0 处增加的拐点 ( x 0 , g u ′ ′ ( x 0 + ) ) (x_0,g''_u(x_0^+)) (x0,gu′′(x0+)),令
S u = { ( i , δ ) ∈ S u ′ ∣ i > x 0 } ∪ ( x 0 , g u ′ ′ ( x 0 + ) ) S_u=\{(i,\delta)\in S'_u\mid i>x_0\}\cup(x_0,g_u''(x_0^+)) Su={(i,δ)Sui>x0}(x0,gu′′(x0+))
f u ′ ( x ) = ∑ ( i , δ ) ∈ S u δ ⋅ r ( x − i ) \displaystyle f'_u(x)=\sum_{(i,\delta)\in S_u} \delta\cdot r(x-i) fu(x)=(i,δ)Suδr(xi),归纳假设成立。

f u ( x ) f_u(x) fu(x) g u ( x ) g_u(x) gu(x) 的最小值为 C u C_u Cu。不难注意到,当子树中存在拐点 ( i , δ ) (i,\delta) (i,δ) i ≤ x 0 i \le x_0 ix0 时,由于已经在 x 0 x_0 x0 极其左侧取得最小值,因而 x 0 x_0 x0 左侧的全部拐点都可以删去。在寻找这样的 x 0 x_0 x0 时,可以依次枚举 S u ′ S_u' Su 中相邻的拐点,找到零点存在的区间然后求出 x 0 x_0 x0,再删去左侧的拐点。

由于 g ( x ) g(x) g(x) 的极小值在 x 0 x_0 x0 处取到,代入 g u ( x ) g_u(x) gu(x) 的转移式可得
C u = ( x 0 − a u ) 2 + ∑ v ∈ son u f v ( x 0 ) = ( x 0 − a u ) 2 + ∑ v ∈ son u C v + ∑ v ∈ son u ∫ − ∞ x 0 f v ′ ( x )   d x \begin{aligned} C_u&= (x_0-a_u)^2+\sum_{v\in \text{son}_u}f_v(x_0) \\[3pt] &= (x_0-a_u)^2+\sum_{v\in \text{son}_u}C_v+\sum_{v\in \text{son}_u}\int_{-\infty}^{x_0} f'_v(x)\,\text{d}x \end{aligned} Cu=(x0au)2+vsonufv(x0)=(x0au)2+vsonuCv+vsonux0fv(x)dx
通过启发式合并可以在 O ( n log ⁡ 2 n ) O(n\log^2 n) O(nlog2n) 的时间内求出所有集合 S u S_u Su 与每个函数对应的最小值 C u C_u Cu。总时间复杂度 O ( n log ⁡ 2 n ) O(n\log^2 n) O(nlog2n)

F Intersection

题意:平面上有 n n n 个圆 C 1 , C 2 , … , C n C_1,C_2,\dots, C_n C1,C2,,Cn,要求画一个圆 O O O(或直线)经过尽可能多的圆。 1 ≤ n ≤ 150 1 \le n \le 150 1n150,坐标范围 0 ≤ ∣ x ∣ , ∣ y ∣ ≤ 1 0 3 0 \le |x|,|y| \le 10^3 0x,y103

解法:当 n ≤ 3 n\le 3 n3 时答案为 n n n。当 n > 3 n>3 n>3 时,最优解一定能通过调整使得与至少两个圆外切。枚举 i , j   ( i ≠ j ) i,j\ (i\neq j) i,j (i=j),假设圆 O O O C i , C j C_i,C_j Ci,Cj 外切,求 O O O 最多能与多少 C k C_k Ck 相交。

C i , C j C_i,C_j Ci,Cj 的半径分别为 r i , r j r_i,r_j ri,rj,圆心分别为 o i , o j o_i,o_j oi,oj(用复数表示)。假设对复平面进行反演映射 f ( z ) = 1 / ( z − o ) f(z)=1/(z-o) f(z)=1/(zo),则反演后 C i C_i Ci 的圆心和半径分别变为

o i ′ = 1 2 ( 1 o i − r i e − o + 1 o i + r i e − o ) = o i − o ( o i − o ) 2 − ( r i e ) 2 r i ′ = 1 2 ∣ 1 o i − r i e − o − 1 o i + r i e − o ∣ = r i ( o i − o ) 2 − ( r i e ) 2 \begin{aligned} o_i'&=\frac{1}{2}\Big(\frac{1}{o_i-r_ie-o}+\frac{1}{o_i+r_ie-o}\Big) \\ &=\frac{o_i-o}{(o_i-o)^2-(r_ie)^2} \\[6pt] r_i'&=\frac{1}{2}\bigg|\frac{1}{o_i-r_ie-o}-\frac{1}{o_i+r_ie-o}\bigg| \\ &=\frac{r_i}{(o_i-o)^2-(r_ie)^2} \\ \end{aligned} oiri=21(oirieo1+oi+rieo1)=(oio)2(rie)2oio=21 oirieo1oi+rieo1 =(oio)2(rie)2ri

其中 e = ( o i − o ) / ∣ o i − o ∣ e=(o_i-o)/|o_i-o| e=(oio)/∣oio。类似地可以计算 C j C_j Cj 的圆心和半径。令反演后 C i ′ C_i' Ci C j ′ C_j' Cj 圆心位置相同,可以得到

o i − o ( o i − o ) 2 − ( r i e ) 2 = o j − o ( o j − o ) 2 − ( r j e ) 2 \frac{o_i-o}{(o_i-o)^2-(r_ie)^2}=\frac{o_j-o}{(o_j-o)^2-(r_je)^2} (oio)2(rie)2oio=(ojo)2(rje)2ojo

解得 A o 2 + B o + C = 0 Ao^2+Bo+C=0 Ao2+Bo+C=0,其中
A = o i − o j B = ( r i 2 − r j 2 )   e 2 − ( o i 2 − o j 2 ) C = ( o i r j 2 − o j r i 2 )   e 2 + o i o j ( o i − o j ) \begin{aligned} A&= o_i-o_j \\ B&= (r_i^2-r_j^2)\,e^2-(o_i^2-o_j^2) \\ C&= (o_ir_j^2-o_jr_i^2)\,e^2+o_io_j(o_i-o_j) \end{aligned} ABC=oioj=(ri2rj2)e2(oi2oj2)=(oirj2ojri2)e2+oioj(oioj)
取圆 C i C_i Ci 内部的点 o o o,则反演后除 C i , C j C_i,C_j Ci,Cj 外的所有圆都在 C i C_i Ci 内部、 C j C_j Cj 外部,且 O O O C i C_i Ci 内切,与 C j C_j Cj 外切。对于每个圆 C k C_k Ck,可以计算出 O O O C k C_k Ck 相交时 C i O C_iO CiO 的辐角取值区间,通过扫描线可以求出最多相交的圆的数量。总复杂度 O ( n 3 log ⁡ n ) O(n^3\log n) O(n3logn)

G LCRS Transform

题意:给出一种对 n n n 个点的二叉树有根树(树根在 1 1 1)的操作:

  • 由深到浅的遍历树上的每个节点 u u u,将 u u u 的右儿子 r u r_u ru 变为 u u u 的左儿子 ℓ u \ell_u u 的右儿子。
  • 然后对于所有只有右儿子没有左儿子的节点,将其右儿子变为左儿子。

问进行 k k k 次操作后有多少棵树能变成给定的树。 1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1n105 0 ≤ k ≤ 1 0 5 0 \le k \le 10^5 0k105

解法:注意到每次操作后树的前序遍历不变,因此可以用前序遍历对所有点重新标号。这样标号后点 u u u 的左儿子 ℓ u \ell_u u 满足 ℓ u = u + 1 \ell_u=u+1 u=u+1,且每次操作后边 ( u , r u ) (u,r_u) (u,ru) 会变为 ( min ⁡ { u + 1 , r u − 1 } , r u ) (\min\{u+1,r_u-1\},r_u) (min{u+1,ru1},ru)—— u + 1 u+1 u+1 对应第一个操作, r u − 1 r_u-1 ru1 对应第二个操作(若执行第二个操作此时满足 r u − 1 = u r_u-1=u ru1=u)。 k k k 次操作后变为 ( min ⁡ { u + k , r u − 1 } , r u ) (\min\{u+k,r_u-1\},r_u) (min{u+k,ru1},ru)

考虑 k k k 次操作后的树最开始的样子。考虑两种边:

  1. 对于操作完成之后的树上的每条满足 r u > u + 1 r_u>u+1 ru>u+1 的边 ( u , r u ) (u,r_u) (u,ru),最开始的树中一定存在边 ( u − k , r u ) (u-k,r_u) (uk,ru)——每一次变化都是执行了 u ← u + 1 u \leftarrow u+1 uu+1。因而需要保证此时的 u > k u>k u>k 且这些边对应的“区间”不相交(这里定义两条边 ( x , y ) (x,y) (x,y) ( ℓ , r ) (\ell,r) (,r) 相交为 ℓ ≤ x < r < y \ell\le xx<r<y x < ℓ < y ≤ r x<\ellx<<yr),否则答案为 0 0 0,因为这样就无法建立一条 u → r u u \to r_u uru 的边。
  2. 对于满足 ℓ u = u + 1 \ell_u=u+1 u=u+1 条件的边 ( u , ℓ u ) (u,\ell_u) (u,u),最开始的边可以为 ( u − i , ℓ u )   ( 0 ≤ i ≤ k ) (u-i,\ell_u)\ (0\le i\le k) (ui,u) (0ik),表示这条边在第 i i i 步开始就从连接右儿子变成连接左儿子,然后相对关系不再变化。

于是这道题等价于:一个长度为 n n n 的线段中给定一些长度大于 k k k 的区间,要求在其中添加一些长度不超过 k k k 的区间,使得所有区间互不相交,问一共有多少种方案。

显然新添加的区间不可能跨过给定的区间,因此可以认为这些给定的区间把整个线段划分为了若干段,单独考虑每一段的贡献。令 f i f_i fi 表示长度为 i i i 的区间的方案数,其中 f 0 = f 1 = 1 f_0=f_1=1 f0=f1=1。对于 i ≥ 2 i\ge 2 i2
f i = f i − 1 + ∑ l = 2 min ⁡ { k + 1 , i } f i − l ⋅ f l − 2 f_i=f_{i-1}+\sum_{l=2}^{\min\{k+1,i\}}f_{i-l}\cdot f_{l-2} fi=fi1+l=2min{k+1,i}filfl2
g = ∑ i = 0 k + 1 f i x i \displaystyle g=\sum_{i=0}^{k+1}f_ix^i g=i=0k+1fixi。当 i ≤ k + 1 i\le k+1 ik+1 g g g 有生成函数等式:
g = x g + x 2 g 2 + 1 g=xg+x^2g^2+1 g=xg+x2g2+1
解得
g = 1 − x − 1 − 2 x − 3 x 2 2 x 2 g=\frac{1-x-\sqrt{1-2x-3x^2}}{2x^2} g=2x21x12x3x2
此时通过多项式求逆求出 f f f 数组的前 k + 1 k+1 k+1 项,即得到了递推的系数项。考虑对于 i > k + 1 i>k+1 i>k+1 时递推式可化简为 f i = f i − 1 + ∑ l = 2 k + 1 f i − l ⋅ f l − 2 \displaystyle f_i=f_{i-1}+\sum_{l=2}^{k+1}f_{i-l}\cdot f_{l-2} fi=fi1+l=2k+1filfl2,转写成多项式形式为:
f = f x + f g x 2 + 1 f=fx+fgx^2+1\\ f=fx+fgx2+1
f = 1 1 − x − g x 2 f=\dfrac{1}{1-x-gx^2} f=1xgx21。可以用多项式求逆和多项式开方在 O ( n log ⁡ n ) O(n\log n) O(nlogn) 时间内求解。

H Matches

题意:给定两个长度为 n n n 的序列 { a } i = 1 n \{a\}_{i=1}^n {a}i=1n { b } i = 1 n \{b\}_{i=1}^n {b}i=1n,现在可以选择其中一个序列交换其中的两个数字,问经过至多一次操作后最小的 ∑ i = 1 n ∣ a i − b i ∣ \displaystyle \sum_{i=1}^n |a_i-b_i| i=1naibi 1 ≤ n ≤ 2 × 1 0 5 1 \le n \le 2\times 10^5 1n2×105 0 ≤ ∣ a i ∣ , ∣ b i ∣ ≤ 1 0 12 0 \le |a_i|, |b_i| \le 10^{12} 0ai,bi1012

解法:考虑交换 a i , a j a_i,a_j ai,aj ,不妨设 a i < a j a_iai<aj ,则交换前后的贡献差 Δ = ∣ a i − b i ∣ + ∣ a j − b j ∣ − ∣ a j − b i ∣ − ∣ a i − b j ∣ \Delta=|a_i-b_i|+|a_j-b_j|-|a_j-b_i|-|a_i-b_j| Δ=aibi+ajbjajbiaibj ,即最大化 Δ \Delta Δ

下面使用一张图来给出最大化 Δ \Delta Δ 的条件。首先定义:

  1. 对于一对 ( a x , b x ) (a_x,b_x) (ax,bx) ( a y , b y ) (a_y,b_y) (ay,by),不妨设 a x < b x a_xax<bx,若 b y < a y b_yby<ay 则称他们成反序关系,若 a y < b y a_yay<by 则为正序。
  2. 若一对 ( a x , b x ) (a_x,b_x) (ax,bx) ( a y , b y ) (a_y,b_y) (ay,by) 在数轴上覆盖范围有重叠,且存在独占一段的情况,称为相交。
  3. 若一对 ( a x , b x ) (a_x,b_x) (ax,bx) ( a y , b y ) (a_y,b_y) (ay,by) 在数轴上覆盖范围有重叠,一段完全包络另一段,称为包络。
  4. 若一对 ( a x , b x ) (a_x,b_x) (ax,bx) ( a y , b y ) (a_y,b_y) (ay,by) 在数轴上覆盖范围没有重叠,称为不交。

不难注意到:

  1. 正序相交=正序包络
  2. 正序不交<反序包络
  3. 反序不交<反序相交

即将反序相交、反序包络进行交换即可。

2023 年牛客多校第一场题解(上)_第1张图片

不难注意到,我们经过一次交换不同种类(正序和反序)的区间,可以消除两倍的重叠(包络)长度。

具体到做法,首先考虑将所有区间一起按右端点( max ⁡ ( a i , b i ) \max(a_i,b_i) max(ai,bi))排序,按右端点递减的顺序依次枚举每个区间。假设当前枚举的区间满足 a i < b i a_iai<bi,这个时候用一个变量 l T l_T lT 维护已经枚举过的区间里面所有满足 a j > b j a_j>b_j aj>bj 的区间中最小的左端点 b j b_j bj,不难发现如果 b j < a i b_jbj<ai,则现在的重叠区间长度为 b i − max ⁡ ( a i , b j ) b_i-\max(a_i,b_j) bimax(ai,bj);对于 a i > b i a_i>b_i ai>bi 的同理可以维护 l S l_S lS

最后答案即为原始答案减去二倍的最大重叠区间长度。总时间复杂度为 O ( n log ⁡ n + n ) \mathcal O(n \log n+n) O(nlogn+n)

你可能感兴趣的:(补题记录,学习笔记,算法,c++)