ST03Day3 树套树

正题

      常见的树套树有:树状数组套(线段树,树状数组),线段树套(线段树,平衡树)。

      树状数组套线段树可以用来操作一些满足可减性的信息的(单点修改,区间查询)与(区间修改,单点查询)。

      二维树状数组(树状数组套树状数组)主要用来做一些满足可减性的矩阵操作。

      线段树套线段树可以维护一些不满足可减性的信息,线段树套平衡树甚至可以用来维护支持插入的第k大的询问。

      比较基础的树套树不会讲,讲的是一些原来不会的东西。

      矩阵赋值、矩阵求最大值

      POI2006 Tet-Tetris 3D

      一个矩阵,初始时全是0。 给某个矩阵赋值(只递增)。 查询某个矩阵中的最大值。

      看起来好像不怎么可做,因为永久性标记无法合并子树信息,这里给出一个巧妙的方法。

      第一维维护x的线段树上的每一个点建两棵线段树,第一棵线段树维护的是覆盖x整个区间的max,第二棵线段树上维护的是只覆盖该区间部分的max。

      那么假若修改完全包含该区间,那么就在第一棵线段树和第二棵线段树上更新max,否则只在第二棵线段树上更新max。

      假若询问完全包含该区间,那么就在第二棵线段树上询问,否则只在第一棵线段树上询问。

      矩阵修改、矩阵求和

      一个矩阵,初始时全是0。 给某个矩阵全部加上一个值。 查询某个矩阵中的元素的和。

      这题其实跟上题类似,理解清楚上一题,就可以明白如果修改完全覆盖该区间,在第一棵线段树+增加的值,在第二棵树上+增加的值*(xr-xl+1)(也就是r-l+1),否则在第二棵线段树上+增加的值*(xr-xl+1)

      如果询问完全覆盖该区间,那么就在第二棵线段树上查询即可,否则在第一棵线段树上查询后*(xr-xl+1)即可。

      Luogu3380 二逼平衡树      

      线段树套平衡树即可。

      带插入区间k小值

      有一个序列,要支持以下几种操作: 插入元素。修改元素。询问区间第k小值。(这里保证值域O(n)

      有很多种做法,我们一个个来说:

      1.插入元素,我们可以想到平衡树套线段树,但好像不太可行,因为splay无法保证深度,套线段树也不可能支持旋转,所以我们就想到了替罪羊树套线段树,时间复杂度可以一个log。

      2.权值线段树套平衡树,首先在根的这个位置上我们可以找到x应该插入的位置,然后我们在每一个线段树的节点中维护一下每个点在下一步是往右走还是往左走,然后每找到插入的位置就去找前驱就好了,与splay的log并列的,所以时间复杂度就是两个log。

      3.还有一个就是分块做法,我们维护块前缀的值j出现了多少次,块前缀的值域块出现了多少次,每次插入元素就将当前块的最后一个元素往后扔,每一个块内的元素就用双向链表来维护,然后同时用sqrtn的时间修改一下上面两个预处理的前缀和,修改元素类似。区间第k小值可以直接在值域块上跳,就可以做到O(sqrt 值域)

      老师说KD-Tree就是优化暴力,没到绝境不要用。

猜你喜欢

转载自blog.csdn.net/Deep_Kevin/article/details/108057145