教堂第四次比赛出题
题目难度 : 提高-
题目描述 :
- 做法 \(1\) :
考虑回滚莫队 , 每一次 \(\text A(num_i)\) , 直接在线段树里面插入。查询的时候直接弄就可以了 , 复杂度 \(O(NM^{\frac{1}{2}} \log N)\)。
当 \(K\) 很小的时候 , 直接跑莫队即可。
预计得分 : \(70 \text p\)。
- 做法 \(2\) :
我们设一个 \(\text{recf}\) 数组 , \(\text{recf}_i\) 表示存在的 \([i-\text K \leq j \leq i-1][j=\text A(num_d)]\) 的个数。那么很显然 , 如果这个东西被单点修改了 , 那么是可以做到 \(O(1)\) 维护的。那么我们可以继续设一个 \(\text{appe}_i\) 代表 \([i=\text A(num_d)]\) 的个数 。 如果 \([\text{appe}_i>0][\text{recf}_i>0]\) 的话就是有贡献的 , 我们再用 \(\text{tech}\) 存 \([\text{appe}_i>0][\text{recf}_i>0]\) 就可以了。对于 \(\text{tech}\) 数组 , 我们进行分块就可以了。查询的时候就直接从后往前查询 , 查询到第一个有 \(1\) 的位置就是答案。
但是这道题的转移实在是麻烦。由于要二层调用函数 , 所以我的时间被卡到了 \(3.23\text s\)。然后我就把所有的转移只调用一层函数 , 写成一坨 , 开个 \(\text O2\)。
复杂度 \(O(NM^{\frac{1}{2}}+MN^{\frac{1}{2}})\)。
预计得分 : \(100 \text p\)。
题目难度 : 提高。
题目描述 :
- 做法 \(1\) :
暴力 \(O(N^2M)\) 飞过。
考虑莫队 , 由于 \(num_i\ \text{mod}\ num_j\) 可以在 \({\max num_i}^{\frac{1}{2}}\) 以搜索状态 , 所以可以做到 \(O(NM^{\frac{1}{2}}{\max num_i}^{\frac{1}{2}})\)。
顺带一提 , 如果各位找到了代码短且足够暴力 \(O(NM)\) 的做法可以跟我说 , 我至今未能找到。
预计得分 : 综合 \(50\text p\)。
- 做法 \(2\) :
二次离线莫队 , 套路题。
首先我们上一个莫队 , 那么就只剩转移 , 注意贡献分两类。
考虑莫队的转移 :
\((l,r)+\text{Aos}(l,r,num_{r+1}) \implies (l,r+1)\)
\((l,r)-\text{Aos}(l,r-1,num_r) \implies (l,r-1)\)
\((l,r)-\text{Aos}(l+1,r,num_l) \implies (l+1,r)\)
\((l,r)+\text{Aos}(l,r,num_{l-1}) \implies (l-1,r)\)
我们设 , 且差分一下 , 且写的更好转移 :
\(\text{Aos(l,r,a)}=\text A(l,r,a)+\text B(l,r,a)\)
\(\text A(l,r,a)=\sum\limits^r_{i=l} [num_i\ \text{mod}\ a=k]=\text C(r,a)-\text C(l-1,a)\)
\(\text B(l,r,a)=\sum\limits^r_{i=l} [a\ \text{mod}\ num_i=k]=\text D(r,a)-\text D(l-1,a)\)
$\text C(x,a)=\sum\limits^x_{i=1} [num_i\ \text{mod}\ a=k]\ [num_i,a>k] \(
\)\text D(x,a)=\sum\limits^x_{i=1} [a\ \text{mod}\ num_i=k]\ [num_i,a>k]$
考虑预处理 \(\text C\) 和 \(\text D\) , 假设 \(x\) (当然 \(x=NM^{\frac{1}{2}}\)) 个数要处理 , 值域为 \(y\) (小于 \(N\)) :
\(\text C\) 函数 , 设 \(\text T\) 为 \(num_i-k\) 。 将 \(\text T\) 的约数存进桶里面即可。时间复杂度 \(\text O(x+Ny^{\frac{1}{2}})\)。注意完全平方数问题。
\(\text D\) 函数 , 设 \(\text T\) 为 \(d \times num_i\) (\(d\) 大于 \(1\) 小于 \(y/num_i\) 的正整数) , 将 \(\text T+k\) 存进去即可。时间复杂度 \(\text O(x+\frac{Ny}{k})\) ( 因为 \(num_i \leq k\) 的没有贡献 , 所以 \(num_i\) 有贡献就至少为 \(k+1\))。
但是出题人万万没有想到 , 因为不可抗力因素 \(\text C\) 函数耗费了他 \(4\text h\) 的时间 , 为了不然大家重蹈覆辙 , 他决定贴出 \(\text C\) 和 \(\text D\) 的代码 : \(\text{Code}\) 。
随后我们用链式前向星连一下即可。有人觉得我的前向星有点神奇 , 其实我是把对答案贡献的正负性和所对答案的 \(\text{id}\) 搞在了一起来省空间。
时间复杂度 \(O(NM^{\frac{1}{2}}+N\ {\max num_i}^{\frac{1}{2}}+\frac{N \max num_i}{k})\)。空间复杂度 : \(O(NM^{\frac{1}{2}}+\max num_i)\) , 出题人卡了一点空间 , 靠人品吧。
预计得分 : \(100 \text p\)。
如果被卡成 \(70\text p\) 肯定是常数或者空间问题。
最后膜拜 \(\text{lxl}\) , 太巨了。

浙公网安备 33010602011771号