zoukankan      html  css  js  c++  java
  • [复习资料]用到树上差分思想的一类题目

    注:此处的树上差分可能和某些树上差分不太一样。

    一次考试考了这样一道题目:

    给出一棵有(n)个节点的树,边有长度,点有两种颜色,一开始全是白色。

    有两个操作:

    修改操作:给出一个修改节点(x),将节点(x)染上黑色。

    询问操作:给出一个询问节点(x),记所有黑点形成的集合为(S),求(sum_{yin S}F(dist(operatorname{LCA}(x,y))))

    函数(F)定义为:(F(x)=sum_{i=1}^{x}i^k)(k)为常数)。

    其中(1le nle 10^5,1le k<P,0le dle 10^7),时限(2s)

    首先考虑如何得到答案,可以设从点(x)到根的路径经过的点依次为为(x_1x_2x_3dots x_y),以它们为根的子树包含的黑点数量为(a_1a_2a_3dots a_y),那么这次查询的答案就是下面几项的累加:

    [egin{matrix}(a_1-0)F(dist_{x_1})\(a_2-a_1)F(dist_{x_2})\(a_3-a_2)F(dist_{x_3})\ vdots \(a_y-a_{y-1})F(dist_{x_y})end{matrix} ]

    即:

    [egin{matrix}a_1(F(dist_{x_1})-F(dist_{x_2}))\a_2(F(dist_{x_2})-F(dist_{x_3}))\ vdots \a_{y-1}(F(dist_{x_{y-1}})-F(dist_{x_y}))\a_yF(dist_{x_y})end{matrix} ]

    然后两个(F)的差值是固定的,所以可以预处理出来。

    对于修改操作,相当于是给点到根路径上的所有点的权值加上一个每个点特定的数。

    对于询问操作,相当于询问点到根路径上的所有点权值之和。

    树剖即可。


    例题:


    P4211 [LNOI2014]LCA

    首先,题目中的询问(sum_{i=l}^rdep[operatorname{LCA}(i,z)])可以拆成两个询问:

    [sum_{i=1}^rdep[operatorname{LCA}(i,z)]]-sum_{i=1}^ldep[operatorname{LCA}(i,z)]] ]

    考虑离线处理,排序后,一个一个点地加入,同时在加入的过程中询问。


    P5305 [GXOI/GZOI2019]旧词

    上一题的弱化版?

    k次方直接前缀和处理。


    考试题:

    给定一棵(n)个节点的树,边有长度,两种操作:修改边权;查询编号在([L,R])之间的节点到节点(x)的路径的长度和。

    [nle 50000,mle 50000 ]

    记节点(x)到根的距离为(dist_x),那么:

    [dis(u,v)=dist_u+dist_v-2dist_{operatorname{LCA}(u,v)} ]

    所以题目相当于要求:

    [(R-L+1)dist_x+sum_{i=L}^Rdist_i-2sum_{i=L}^{R}dist_{operatorname{LCA}(u,v)} ]

    前两个很好维护,如果忽略修改,最后一个也可以排序后处理,所以关键是如何求出第三个式子。

    前面的题目都没有带修改,考虑修改怎么做,由于修改只有一条边,所以可以直接找到线段树上那条边对应的节点修改就好了。

    考虑将修改分块,然后在每个块内枚举1到(n)个点,然后再记录一个时间戳表示当前所在的询问编号,对于某个查询,直接将当前时间跳到当前询问的时间戳位置,边跳边修改边权。

    若块的数量为(B),节点数和操作数相当,所以时间复杂度就是(O(Bnlog_2^2n+n^2log_2n/B))


    P3241 [HNOI2015]开店

    处理后就是P4211 [LNOI2014]LCA的强制在线版本。

    强制在线怎么写?考虑到离线时我们是一个一个点加的,加入一个点相当于是修改了一条链,在线段树上修改了(log_2n)个区间,考虑直接维护每个点加入后的信息,用可持久化线段树即可,空间复杂度(O(nlog_2^2n))

    话说这样题目中这个树所有顶点的度数都小于或等于 3 这个条件就没用了欸


    感觉这类差分可能算是一种套路吧,所以把它写了下来。

    另:把分块那题和可持久化线段树那题套在一起,分块加主席树,又是一道好题(滑稽

  • 相关阅读:
    linux查看CPU和内存信息
    linux yum命令详解
    查看文件中关键字前后几行的内容
    vue.js+web storm安装及第一个vue.js
    android GPS: code should explicitly check to see if permission is available
    ASP.NET MVC Identity 使用自己的SQL Server数据库
    阿里云服务器,tomcat启动,一直卡在At least one JAR was scanned for TLDs yet contained no TLDs就不动了
    ASP.NET MVC4 MVC 当前上下文中不存在名称“Scripts”
    python 将windows字体中的汉字生成图片的方法
    Java android DES+Base64加密解密
  • 原文地址:https://www.cnblogs.com/lsq147/p/14232437.html
Copyright © 2011-2022 走看看