做题记录 25.1.30
\(\textcolor{purple}\odot\) CF1422F Boring Queries
即静态强制在线区间 \(\operatorname{lcm}\)
考虑根号分治
令 \(V\) 为 \(a\) 数组最大值
对于 \(\le V\) 的质因子,可以为每个质数分别建立一个 \(ST\) 表,保存区间该质数幂次最大值,通过预处理质因子的次幂,可以 \(O(1)\) 处理一个质因子,可以将 \(ST\) 表用 uint8_t 存储以压缩空间
这部分时间复杂度 \(O\left(\frac{\sqrt V}{\ln V}\cdot (n\log n+q)\right)=O\left(n\sqrt V+\frac{q\sqrt V}{\ln V}\right)\)
对于 \(>V\) 的质因子,每个 \(a_i\) 至多包含一个,令所有 \(a_i\) 都除净 \(V\) 以内的质因子,则转化为查询区间中所有出现过的数之积,转化为类似二维数点的问题后可持久化线段树解决即可
这部分时间复杂度 \(O(n\sqrt V+n\log n+q\log n)\)
总时间复杂度 \(O\left(n\sqrt V+\frac{q\sqrt V}{\ln V}+n\sqrt V+n\log n+q\log n\right)=O\left(n\sqrt V+(n+q)\log n+\frac{q\sqrt V}{\ln V}\right)\)
有 \(O(n\log^2n)\) 的做法(假定 \(n,q,V\) 同阶)
\(\textcolor{purple}\odot\) CF468C Hack it!
令 \(inf=10^{18}\)
发现若 \(x<inf\),则 \(f(x+inf)=f(x)+1\)
因此 \(\sum_{i=inf}^{inf+x-1} f(i)=x+\sum_{i=0}^{x-1}f(i)\)
令 \(p=\left(\sum_{i=0}^{inf-1} f(i)\right)\bmod a\)
则 \(\sum_{i=a-p}^{a-p+inf-1}f(i)\equiv p+(a-p)\equiv 0\pmod a\)
若能求出 \(p\),则可构造区间 \([a-p,a-p+inf-1]\)
在 \([0,inf-1]\) 中,\(18\) 个数位上 \(0\sim 9\) 都是均匀的,因此每个数的每个数位平均为 \(4.5\),每个数的平均 \(f\) 函数值为 \(18\times 4.5=81\),总和为 \(81\times 10^{18}\),即 \(p=81\times10^{18}\bmod a\)
时间复杂度 \(O(1)\)
\(\textcolor{purple}\odot\) CF1004F Sonya and Bitwise OR
线段树,每个节点保存区间前后缀 \(or\) 和序列(保存极长相同连续段,可证数量不超过区间长的 \(\log\))及区间内答案,合并时双指针求出左右之间的贡献,并暴力枚举得到父节点的前后缀序列
时间复杂度 \(O(n\log V+q\log n\log V)\)
相似题
\(\textcolor{purple}\odot\) P4435 [COCI 2017/2018 #2] Garaža \(\quad\) 代码
\(\textcolor{purple}\odot\) P5324 [BJOI2019] 删数
对于一个数组 \(a\),令 \(cnt_i\) 为 \(i\) 的数量,有数组 \(c_{1\sim n}\),对于每个 \(i\le n\),令 \(c[i-cnt_i+1:i]\) 加一,则 \(a\) 最少操作次数为 \(c[1:n]\) 中 \(0\) 的数量
每次 \(a\) 的单点修改相当于一个 \(cnt\) 加,一个 \(cnt\) 减,转化为 \(c\) 的单点修改
每次全局加减相当于令 \(c\) 平移,若某个 \(i\) 移出或移入右边界,则撤销对应的 \(cnt\),通过维护一个全局加法标记,可转化为 \(c\) 的区间加减
问题转化为 \(O(q)\) 次区间加,区间查询 \(0\) 的数量,且保证全局非负
线段树维护每个节点最小值和最小值数量即可
时间复杂度 \(O(n\log n)\)(假定 \(n,q\) 同阶)

浙公网安备 33010602011771号