RDOI Round #1 solution 发表于 2024-12-14 | 更新于 2024-12-14
|
猫树
由于必须走到点 n + 1 n+1 n + 1 ,所以先减掉贡献,然后二分到一个宽松的下界,使得能获得 ≥ m i d \ge mid ≥ m i d 的金币的操作都能进行。
剩下的操作显然不足 n n n 次,用堆模拟即可。
记忆余晖
Θ ( 3 n ) \Theta(3^n) Θ ( 3 n ) 的做法是原题,故不做阐述。
正解为 Θ ( 2 n n 2 ) \Theta(2^nn^2) Θ ( 2 n n 2 ) 的做法,如下:
考虑把 1 ∼ n 1\sim n 1 ∼ n 依次插入,设 g i g_i g i 表示前缀 1 ∼ i 1\sim i 1 ∼ i 的 L I S LIS L I S 长度。
由定义可知 0 ≤ g i + 1 − g i ≤ 1 0\leq g_{i+1} - g_{i}\leq 1 0 ≤ g i + 1 − g i ≤ 1 于 n ≤ 21 n\leq 21 n ≤ 2 1 ,状压差分储存。
设现在插入 i i i ,插在位置 j j j :
g j g_j g j 会是 g j + 1 + 1 g_{j+1}+1 g j + 1 + 1 ,然后会更新一段从 j j j 开始的前缀为 g j g_j g j 。
可以借助一下代码理解:
int tps ( 1 <<(j-1 ) ) ;int lows ( s&(tps-1 ) ) ,highs ( s^lows ) ;int mark ( lows^tps^(highs<<1 )^(lowbit(highs<<1 )) ) ;
乘积、欧拉函数、求和
首先,我们知道,φ ( n ) = n ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) … ( 1 − 1 p k ) φ(n) = n(1-\frac{1}{p_1})(1-\frac{1}{p_2})\dots(1-\frac{1}{p_k}) φ ( n ) = n ( 1 − p 1 1 ) ( 1 − p 2 1 ) … ( 1 − p k 1 ) ,其中 p 1 ∼ p k p_1 \sim p_k p 1 ∼ p k 是 n n n 的互不相同 的质因数。
知道这个之后,我们就可以先线性筛 + 质因数分解,以 Θ ( m m ln m ) \Theta(m \frac{\sqrt m}{\ln {\sqrt m}}) Θ ( m l n m m ) 的复杂度预处理出 1 ∼ m 1 \sim m 1 ∼ m 中所有数的质因数集合,设 i i i 的质因数集合为 P i P_i P i 。
那么,我们考虑 φ ( u v ) φ(uv) φ ( u v ) ,可以发现,φ ( u v ) = u v ( 1 − 1 q 1 ) ( 1 − 1 q 2 ) … ( 1 − 1 q k ) φ(uv)=uv(1-\frac{1}{q_1})(1-\frac{1}{q_2})\dots(1-\frac{1}{q_k}) φ ( u v ) = u v ( 1 − q 1 1 ) ( 1 − q 2 1 ) … ( 1 − q k 1 ) ,其中 q 1 ∼ q k q_1 \sim q_k q 1 ∼ q k 是 u u u 与 v v v 的质因数集合的并集中的元素,因为 u u u 与 v v v 中相同的质因数只能做一次贡献。
为了方便,我们重新定义 gcd \gcd g cd 函数。
令 gcd ( i , j ) = ∏ ( P i ∩ P j ) \gcd(i,j) =\prod(P_i \cap P_j) g cd( i , j ) = ∏ ( P i ∩ P j ) 。
通过上述预处理和 set
维护就可以写出 Θ ( min ( n , m ) 2 ) \Theta(\min(n,m)^2) Θ ( min ( n , m ) 2 ) 的暴力,预期得分 30 p t s 30pts 3 0 p t s 。
考虑特殊性质 A A A ,即只有加入 x i x_i x i 的操作的做法。这种题目一般来说都要增量式计算贡献,即对于 x i x_i x i 考虑之前 S S S 中所有的数与它的贡献。可以发现,≤ 5 × 1 0 5 \leq 5 \times 10^5 ≤ 5 × 1 0 5 的数中,每个数不同质因数的个数不会超过 6 6 6 ,因为 2 × 3 × 5 × 7 × 11 × 13 × 17 = 510510 > 5 × 1 0 5 2 \times 3 \times 5 \times 7 \times 11 \times 13 \times 17 =510510 > 5 \times 10^5 2 × 3 × 5 × 7 × 1 1 × 1 3 × 1 7 = 5 1 0 5 1 0 > 5 × 1 0 5 ,这也告诉我们,确定 x i x_i x i 后,它与其它数的 gcd \gcd g cd 最多只有 2 6 2^6 2 6 种。设数组 V i V_i V i 初值为 0 0 0 ,每加入一个数便在其所有可能的 gcd \gcd g cd 对应的 V V V 上加上它本身。这样就可以对于一个加入的 x i x_i x i ,枚举可能的 gcd \gcd g cd 来计算答案。然而,这样显然会算重,例如 gcd \gcd g cd 为 6 6 6 的会在 gcd \gcd g cd 为 6 , 3 , 2 , 1 6,3,2,1 6 , 3 , 2 , 1 时被算到。但是,可以发现算重的一定是真正 gcd \gcd g cd 的子集。所以复制一个 V V V 数组为 A A A ,从大到小枚举可能的 gcd \gcd g cd ,若当前枚举到的 gcd \gcd g cd 为 d d d ,则 A A A 中 d d d 的因数位置的值全部减去 A d A_d A d 即可。可以发现这是在做一个容斥。这样的话,预期得分就有 60 p t s 60pts 6 0 p t s 了。
删除操作和加入操作的做法几乎一致,故不再赘述。预期得分 100 p t s 100pts 1 0 0 p t s 。
但是,这样做法的时间复杂度是 Θ ( n × ( 2 max ( s i z P i ) + 3 max ( s i z P i ) ) ) \Theta(n \times (2^{\max(siz_{P_i})}+3^{\max(siz_{P_i})})) Θ ( n × ( 2 m a x ( s i z P i ) + 3 m a x ( s i z P i ) ) ) 的 ,并且常数较大,所以容易被卡常。于是就有了数据随机生成和特殊性质 A A A 。特殊性质 A A A 因为不能在一个数上反复横跳所以显然达不到该复杂度上界。而数据随机生成的期望修改与查询次数都较低,约为 50 50 5 0 。
重逢之时
此题每次询问区间,又未要求在线,可用扫描线的思路,枚举一个端点,数据结构维护另一个端点的值。
分析可得,从 i − 1 i-1 i − 1 到 i i i 的增量是不好处理的,所以不能每次利用相邻数的信息来更新。
考虑 i i i 本身,对前面的数按与 a i a_i a i 的大小关系分讨。对于 a j < a i , j < i a_j<a_i,j<i a j < a i , j < i 此情况最大的 j j j ,一定可以可以用 a i − a j a_i-a_j a i − a j 更新左端点 ∈ [ 1 , j ] \in[1,j] ∈ [ 1 , j ] 的区间。此时,对于 a b s ( a k − a j ) ≤ a i − a k , k < j abs(a_k-a_j) \leq a_i-a_k,k<j a b s ( a k − a j ) ≤ a i − a k , k < j ,就不需要去更新了,因为在 j j j 作为加入标号时,对于左端点 ∈ [ 1 , k ] \in[1,k] ∈ [ 1 , k ] 的区间已经更新过 a b s ( a k − a j ) abs(a_k-a_j) a b s ( a k − a j ) ,所以发现合法的 k k k 满足 a k > a i + a j 2 a_k>\frac{a_i+a_j}{2} a k > 2 a i + a j 。发现每次值域减半,所以理论更新次数为 log V \log V log V 级别。
考虑如何实现,维护端点答案需要一颗线段树,同时需要知道形如 a i < a j , i < j a_i<a_j,i<j a i < a j , i < j 的最大的 j j j ,可以对权值开线段树,i i i 表示权值为 i i i 的最大编号,查询可以二分。发现对于对于原序列的修改是前缀 min \min min ,区间求和,直接维护是不好做的,但由于是前缀 min \min min ,那么答案序列一定是有单调性的,所以就可以先二分出可以更新的区间,然后再用区间推平(赋值)做修改,这样就能够求和了。
总时间复杂度 Θ ( n log 2 V + q log n ) \Theta(n\log^2V+q\log n) Θ ( n log 2 V + q log n ) 。