首页 > 其他分享 >P7710 [Ynoi2077] stdmxeypz 题解

P7710 [Ynoi2077] stdmxeypz 题解

时间:2022-12-18 23:44:34浏览次数:85  
标签:stdmxeypz 题解 复杂度 sqrt times P7710 修改 dfn

@LHF dalao 的题解进行一些补充说明。因为他讲的实在是太难懂了。最后在 @_•́へ•́╬_ dalao 的帮助下才勉强知道怎么做。不过他的代码非常简洁易懂,有需求的可以去看他的代码。我就不放了。

本文章分析复杂度时认为 \(n\) 与 \(m\) 同阶。


首先需要明确的是,\(a\) 子树中所有与 \(a\) 的距离模 \(x\) 等于 \(y\) 的节点就是 \(a\) 子树中深度模 \(x\) 等于 \((dep_a+y)\bmod x\)(下文设其为 \(k\))的节点。这样我们就可以把修改转化为将一个点的子树内所有深度模 \(x\) 为 \(k\) 的节点权值加上 \(z\)。

显然这种数据结构题不可能一个点一个点地去修改。因此先求出 dfn 序。这样就可以把修改变为对 \([dfn_a,dfn_a+size_a-1]\) 范围内(下文设其为 \([l,r]\))的点进行一次区间操作。

但是我们不可能将 \([l,r]\) 范围内的所有值统一加上某数。因此考虑建立一个以 dfn 序为 \(x\) 轴,深度为 \(y\) 轴的平面直角坐标系。把第 \(i\) 个点放在坐标 \((dfn_i,dep_i)\) 上。这样我们就把修改转化为将所有横坐标在 \([l,r]\) 范围内,纵坐标模 \(x=k\) 的节点权值全部加上 \(z\)。

考虑直接暴力跳纵坐标,将跳到的水平线的 \([l,r]\) 部分全部加上 \(z\)。因为 dfn 序与深度不对应的坐标是空着的,没有放点。所以把 \([l,r]\) 的整个部分全部加上 \(z\) 不会影响正确性。

用某种数据结构维护每个纵坐标对应的水平线。当 \(x > \sqrt n\) 时,暴跳的复杂度就是 \(O(\sqrt n) \times O(Modify)\) 的。查询时直接单点查询,因此复杂度是 \(O(1) \times O(Query)\) 的。其中 \(O(Modify)\) 表示这种数据结构修改的复杂度,\(O(Query)\) 表示它查询的复杂度。因此使用修改 \(O(1)\),查询 \(O(\sqrt n)\) 的序列分块+差分即可达到最优总复杂度。

当 \(x \leq \sqrt n\) 时,暴跳的时间复杂度可能会直接退化到 \(O(n)\)。因此考虑根号分治,将这部分特殊处理。开一个 \(\sqrt n \times \sqrt n\) 的某种数据结构的数组,记为 \(DS_{i,j}\)。每次修改对 \(DS_{x,k}\) 执行一次让 \([l,r]\) 区间加 \(z\) 的操作。询问时给答案加上 \(\sum\limits_{i=1}^{\sqrt n} DS(i,dep_a \bmod i,dfn_a)\) 即可。修改复杂度为 \(O(1) \times O(Modify)\),询问复杂度为 \(O(\sqrt n) \times O(Query)\)。因此使用修改 \(O(\sqrt n)\),查询 \(O(1)\) 的序列分块即可达到最优总复杂度。

因为这两种处理都用到分块,所以可以直接把散块暴力算,整块再分类讨论。

时空复杂度 \(O(n \sqrt n)\)。时间限制十分充裕,但空间限制不够。可以通过调块长和根号分治的阈值卡过去。

代码就不放了,有需求的可以去看 @LHF dalao 的题解中的代码。

标签:stdmxeypz,题解,复杂度,sqrt,times,P7710,修改,dfn
From: https://www.cnblogs.com/DRPLANT/p/P7710_stdmxeypz_solution.html

相关文章

  • P6877 题解
    前言题目传送门!更好的阅读体验?贪心。内容抄自某校课件。思路部分分这个随便搞都可以,可以二分答案然后建边然后跑二分图最大匹配。正解考虑贪心。这里有一个重要的......
  • P3556 题解
    前言题目传送门!更好的阅读体验?最短路应用。内容抄自某校课件。思路首先想到题目与最短路有关。假如\(a\)到\(b\)的最短路径长度是\(x\),那么对于一个询问是否存......
  • Codeforces Polynomial Round 2022 (Div.1 + Div.2) CF 1774 题解
    A.AddPlusMinusSign如果有偶数个1,显然可以通过加减各一半的方式达到和为0;否则可以达到和为1。需要注意如果序列的第一个数是1,则它的前面只能填加号。时间复杂度\(O(n......
  • Codeforces Polynomial Round 2022 (Div.1 + Div.2) CF 1774 题解
    A.AddPlusMinusSign如果有偶数个1,显然可以通过加减各一半的方式达到和为0;否则可以达到和为1。需要注意如果序列的第一个数是1,则它的前面只能填加号。时间复杂度\(O(n......
  • Codeforces Polynomial Round 2022 (Div.1 + Div.2) CF 1774 题解
    A.AddPlusMinusSign如果有偶数个1,显然可以通过加减各一半的方式达到和为0;否则可以达到和为1。需要注意如果序列的第一个数是1,则它的前面只能填加号。时间复杂度\(O(n......
  • Codeforces Polynomial Round 2022 (Div.1 + Div.2) CF 1774 题解
    A.AddPlusMinusSign如果有偶数个1,显然可以通过加减各一半的方式达到和为0;否则可以达到和为1。需要注意如果序列的第一个数是1,则它的前面只能填加号。时间复杂度\(O(n......
  • [CSP-S 2022] 假期计划 题解
    题面题面冗长,不便展示,详见洛谷。考场想法对于每一个点给他能到达的点都建一条边,最后跑一遍DFS。期望分数:\(60\)。代码朴素想法枚举所有可能的四个点,看是否能“互......
  • 题解 [ABC133F] Colorful Tree
    原题链接考虑正常的\(u\)和\(v\)之间的距离怎么去求:我们可以维护每个值到根的距离\(dist_i\),然后通过计算\(dist_u+dist_v-2\timesdist_{lca}\)得到,这里就不过......
  • IDEA中Maven项目 子项目中缺少parent标签及无web框架问题解决
    Question在maven项目中,创建的子模块的pom中没有标签,但父模块中有,造成运行时提示版本源过低原因:maven的settings.xml中默认jdk版本过低解决方法:在maven中指定jdk版本,找到......
  • [ABC282D] Make Bipartite 2 题解
    题目描述给定一个无向简单图\(G\),统计有多少个点对\((u,v)\)满足:\(u,v\)之间没有边直接连接:\((u,v)\notin\textE\)连接\((u,v)\)后\(G\)是二分图......