CF round 633 div 2 Powered Addition 改编题面&题解

题目大意:

现在有一个长度为 n ( 2 ≤ n ) n(2 \leq n) n2n的整数序列 A i A_i Ai,对于数列中第 i i i个数 ( 2 ≤ i ≤ n ) (2 \leq i \leq n) (2in),你可以选择选择任意一个 j ( j > 0 ) j(j>0) j(j>0)使 A i A_i Ai加上 ∑ k = 0 j − 1 3 k \sum_{k =0}^{j-1} 3^k k=0j13k,记这个累加后的数为 B i B_i Bi,于是可以得到一个新数列 B i B_i Bi,你需要让 B i B_i Bi序列单调递增,现在请你找到满足 B i B_i Bi序列单调递增时所有数选择的 j j j中最小的 j j j
∣ A i ∣ ≤ 1 e 9 , n ≤ 5 ∗ 1 0 6 |A_i| \leq 1e9, n \leq 5*10^6 Ai1e9,n5106
保证数据随机且分布均匀

题解:

首先易得 ∑ k = 0 j − 1 3 k \sum_{k=0}^{j-1} 3^k k=0j13k = 1 2 ∗ ( 3 j − 1 ) \frac{1}{2} *(3^j - 1) 21(3j1).
容易发现在 j j j取得 21 21 21的时候 2 ∗ 1 0 9 ≤ 1 2 ∗ ( 3 21 − 1 ) 2 * 10^9 \leq \frac{1}{2} * (3^{21} - 1) 210921(3211),且这时的 j j j是满足 2 ∗ 1 0 9 ≤ 1 2 ∗ ( 3 21 − 1 ) 2 * 10^9 \leq \frac{1}{2} * (3^{21} - 1) 210921(3211)的最小的 j j j
我们可以分类讨论。
我们从 1 − > n 1->n 1>n枚举:

1. 1. 1.预处理 1 2 ∗ ( 3 j − 1 ) \frac{1}{2} *(3^j - 1) 21(3j1),每次暴力枚举,得到 B x B_x Bx.
复杂度 O ( 21 x ) O(21x) O(21x),你要 e r f e n erfen erfen随你.

2. 2. 2. 当发现 B x = A x + 3 k ( 21 ≤ k ) B_x = A_x + 3^{k} (21 \leq k) Bx=Ax+3k(21k)时,如果 A x > A x + 1 A_x > A_{x+1} Ax>Ax+1, 则 B x + 1 = A x + 1 + 3 k + 1 B_{x+1} =A_{x+1} + 3^{k+1} Bx+1=Ax+1+3k+1;如果 A x ≤ A x + 1 A_x \leq A_{x+1} AxAx+1,则 B x + 1 = A x + 1 + 3 k B_{x+1} = A_{x+1} + 3^{k} Bx+1=Ax+1+3k,以此类推
复杂度 O ( n − x + 1 ) O(n-x+1) O(nx+1)

x x x为第一个 B x = A x + 3 k ( 21 ≤ k ) B_x = A_x + 3^{k} (21 \leq k) Bx=Ax+3k(21k)时的下标。
总复杂度 O ( n  ⁣ −  ⁣ x  ⁣ + 1  ⁣ +  ⁣ 21 x ) O(n\!-\!x\!+1\! + \!21x) O(nx+1+21x)

你可能感兴趣的:(自己想的小问题(水题))