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

news2024/12/27 16:19:22

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|<r 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\ (1<s<t\le n) Ps,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} <c_i 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 <k ai<k 时, 0 ≤ c i + k b i < k 0 \le c_i+kb_i<k 0ci+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 x<x_0 x<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 x<r<y x<r<y x < ℓ < y ≤ r x<\ell<y\le r x<<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_i<a_j ai<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_x<b_x ax<bx,若 b y < a y b_y<a_y by<ay 则称他们成反序关系,若 a y < b y a_y<b_y ay<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. 反序不交<反序相交

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

在这里插入图片描述

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

具体到做法,首先考虑将所有区间一起按右端点( max ⁡ ( a i , b i ) \max(a_i,b_i) max(ai,bi))排序,按右端点递减的顺序依次枚举每个区间。假设当前枚举的区间满足 a i < b i a_i<b_i ai<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_j<a_i bj<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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/787871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ASEMI代理海矽美快恢复二极管SFP6002的特性和应用分析

编辑-Z 二极管SFP6002是一种常见的电子元件&#xff0c;也被称为快恢复二极管。它具有快速恢复时间和低反向恢复电流的特点&#xff0c;适用于高频电路和开关电源等应用。 SFP6002的主要特性包括&#xff1a; 1. 快速恢复时间&#xff1a;SFP6002具有快速的恢复时间&#xff…

Git Gui相关术语

文章目录 Git Gui主界面相关术语- Amend Last Commit&#xff08;修正最后一次提交&#xff09;- Rescan&#xff08;重新扫描&#xff09;- Sign Off&#xff08;签名&#xff09;- Stage Changed Git Gui Commit菜单相关术语- Stage to Commit&#xff08;暂存到提交&#xf…

Ceph组件

Ceph组件 无论是想向云平台提供Ceph 对象存和 Ceph 块设备服务、部署Ceph 文件系统,或者是将 Ceph 用于其他目的,所有 Ceph 存储集群部署都从设置每个 Ceph 节点、网络开始。 一个Ceph 存储集群至少需要一个Ceph Monitor、Ceph Manager和 Ceph OSD (OBJECT STORAGE DAEMON对象存…

【MySQL】十三,索引的代价、MySQL数据结构选择的合理性

索引的代价 空间上的代价 每建立一个索引都要为它建立一棵B树&#xff0c;每一棵B树的每一个节点都是一个数据页&#xff0c;一个页默认会占用 16KB 的存储空间&#xff0c;一棵很大的B树由许多数据页组成&#xff0c;那就是很大的一片存储空间。 时间上的代价 每次对表中的…

前端开发中的常见优化

目录 外观 兼容 不同尺寸&#xff08;包裹&#xff0c;height:100%&#xff09; 不同 浏览器 隐藏滚动条 的 不同属性名 重排->重绘 不显示 display:none->禁用disable 性能 导航重复&#xff08;修改原型push、replace方法&#xff09; 搜索防抖 import { debo…

【Docker】Docker私有仓库管理

目录 一 、Harbor 简介1.1 什么是Harbor1.2Harbor的特性1.3Harbor的构成 二、Harbor部署2.1 部署 Docker-Compose 服务2.2 部署 Harbor 服务2.3启动Harbor2.4 创建一个新项目2.5 在其他客户端上传镜像 三、配置Harbor 高可用四、维护管理Harbor4.1. 通过 Harbor Web 创建项目4.…

提升Web3安全性和用户体验:元事务和加密技术的应用

在Web3中&#xff0c;去中心化应用程序&#xff08;DApps&#xff09;是一种基于区块链技术的应用程序&#xff0c;它们通过智能合约实现透明、安全、去中心化的业务逻辑。然而&#xff0c;DApps的使用门槛比传统的中心化应用程序更高&#xff0c;需要用户具备一定的技术知识&a…

python简单入门

python简单入门 文章目录 python简单入门[toc] 地址链接1. 官网2. 下载地址3. 官方文档 1. 第一章1.1 python解释器1.2 基础语法1.2.1 常见数据类型1.2.2 强制类型转换1.2.3 注释1.2.4 运算符1.2.5 字符串1.2.5.1 字符串的定义1.2.5.2 字符串拼接1.2.5.3 格式化字符串1.2.5.3 精…

profinet 调试记录

一、 树莓派运行codesys runtime Codesys control for Raspberry Pi (外网) 链接&#xff1a;https://pan.baidu.com/s/1vgURlEG_y4C5rj7rALdOdQ?pwdfkhr 提取码&#xff1a;fkhr 1. 用户名称要以 root 登录 若是普通用户&#xff0c;会提示&#xff1a;脚本必须以 root 身…

Facebook Messenger市场营销,跨境电商不可忽略的营销手段

营销始于广告。广告仍然是不可或缺的&#xff0c;但广告的方式正在发生变化。以前商家会使用广告邮件或者直接转到网站上的产品页面&#xff0c;但是这两种方法都存在很大问题。虽然企业可以通过电子邮件与潜在客户保持联系&#xff0c;但不能保证这些潜在客户会真正看广告邮件…

【算法与数据结构】104、111、LeetCode二叉树的最大/最小深度

文章目录 一、题目二、层序遍历法三、递归法四、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、层序遍历法 思路分析&#xff1a;两道题都可以用层序遍历&#xff08;迭代法&#xff09;来做&#xff0c;遍历完…

通付盾获苏州市工业互联网产业联盟“工业互联网看苏州”先锋企业

近日&#xff0c;苏州市工业互联网产业联盟公布2022年度苏州市工业互联网产业联盟系列评选获评名单&#xff0c;通付盾荣获“工业互联网看苏州”先锋企业。 为加快推动工业互联网在数字赋能产业创新集群融合发展中发挥更显著作用&#xff0c;进一步完善苏州市工业互联网产业生态…

Docker Compose 容器编排 + Docker--harbor私有仓库部署与管理

目录 一、Docker Compose简介 1、Docker Compose 的YAML 文件格式及编写注意事项 2、Docker compose 使用的三个步骤 3、 Docker Compose配置常用字段 4、 Docker Compose 常用命令 5、 Docker Compose 文件结构 二&#xff1a; Docker Compose 安装 1、Docker Compose…

【C#】并行编程实战:基于任务的异步编程基础(下)

第八章介绍了 C# 中可用异步编程的实践和解决方案&#xff0c;还讨论了何时适合使用异步编程等。本章主要介绍 async 和 await 关键字。 其实在之前的学习中&#xff0c;大家都已经了解过这两个关键字了&#xff0c;用得非常多。其实我觉得没有必要再赘述了&#xff0c;不过这里…

Git简介与工作原理:了解Git的基本概念、版本控制系统和分布式版本控制的工作原理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Centos安装postgresql数据库以及postgis扩展的安装

这几天项目上的数据库迁移差点没把我弄死 &#xff0c;因为项目上的使用的是postgis来处理地理数据 &#xff0c;而开发环境的数据库以及postgis扩展并不是我安装的。所以在迁移的时候造成了不小的麻烦。记录一下迁移过程中遇到的。下面以Centos操作系统为例 文章目录 卸载post…

微信小程序——实现手机振动效果

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

解决行业反复“造轮子”现象,全新地平线RDK系列机器人开发者套件上线

7月25日&#xff0c;“地平线2023机器人开发者创享日”在深圳举办&#xff0c;地平线RDK系列机器人开发者套件正式上线&#xff0c;机器人操作系统TogetheROS.Bot™2.0版发布&#xff0c;应用中心NodeHub首发亮相&#xff0c;地平线开发者社区改版上线。 地平线2023机器人开发者…

go性能分析工具之trace

参考文章&#xff1a; https://eddycjy.gitbook.io/golang/di-9-ke-gong-ju/go-tool-trace https://mp.weixin.qq.com/s__bizMzUxMDQxMDMyNg&mid2247484297&idx1&sn7a01fa4f454189fc3ccdb32a6e0d6897&scene21#wechat_redirect 你有没有考虑过&#xff0c;你的g…

HTTP1、 HTTP2、HTTP3 区别

HTTP1、 HTTP2、HTTP3 区别 HTTP1HTTP/1.0和HTTP/1.1的区别HTTP1的缺陷 HTTP2SPDY协议HTTP/2 新特性&#xff08;即HTTP/2.0和HTTP/1.x的区别&#xff09;HTTP/2 的缺点 HTTP3QUIC协议HTTP/3 新特性&#xff08;HTTP/3与HTTP/2、HTTP/1的区别&#xff09;基于QUIC的0RTT是如何实…