这样的话就会出现一个问题,假如我们修改的是下图的橙色区间,然鹅当前的pos为下图的蓝色区间,那么就会多修改下图的红色区间: 也就是说,假如我们要修改[nl, nr][nl, nr],但是当前为[l,r][l,r],为了保证不出现上图情况,我们可以修改[max(nl,l),min(nr,r)][max(nl,l),min(nr,r)](感性理解) 那么我们只需要修改得出:
使用主席树处理版本控制。由于涉及到区间修改,考虑使用懒标记,在区间更新的时候顺带求出区间和,避免传递懒标记可以节省时间,实测500多ms跑完。 1#defineIO std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)2#definebug(x) cout<<#x<<" is "<<x<<endl3#include <iostream>4#include <list>5#...
那么就可以用pre[i]表示i这个数上一次出现的位置在哪,那么对于新的主席树更新区间就是(pre[i],i),之后的操作与洛谷P2048几乎相同 #include<bits/stdc++.h> #define inf 0x3f3f3f3f #define lson l,mid #define rson mid+1,r using namespace std; typedef long long ll; const int mx = 2e5 + ...
不妨我们先拿总区间[1,5]来说,对这个总区间建立一棵线段树,维护数据区间[l,r]之间数字个数,这里l,r应该取序列a的最小值1和最大值8。若题目给的数太大,一般要进行离散化,下文再提。 画出这棵线段树: 红色数字代表出现在数据区间[l,r]内的数字个数。 现在有了这棵线段树,我就能询问总区间【1,5】内的...
HDU-4348 To the moon(主席树区间修改 永久化标记) link 题意: 给定一个长度为1 e 5的数组,有1 e 5次操作,操作有下面四种: Clrd: 将[ l , r ]的值都加d,时间增加1 Qlr: 询问当前时间[ l , r ]的区间和 Hlrt: 询问t时间[ l , r ]的区间和...
2019-12-04 21:32 −# 题目 [传送门](https://www.luogu.com.cn/problem/P3380) # 思路 挺好的一道树套树的板子题 因为笔者过于菜鸡~~其实是懒~~ 写了BIT套主席树 求区间第k大,前驱和后驱都是主席树的基本操作 所有此处要阐述的是修改操作 如果是直接单纯用主席树 那么修改一... ...
用树状数组维护一个区间修改的信息,每一个节点的范围跟树状数组没有区别,但我们需要用主席树去维护这个树状数组,树状数组的每一个节点都是一颗值域线段树,保存树状树状每一个节点的根,每次修改就对树状数组包含这个元素的节点进行修改,每次修改都相当于删除一个元素再插入一个元素,每次维护都要基于这个节点的原本信息进...
但是如果用线段树的区间操作里面,使用lazy标记去进行区间修改,是不对的。 标记永久化:标记永久化,顾名思义,指标记一旦被打上,就不再下传或清空。而是在询问的过程中计算每个遇到结点对当前询问的影响。 因为对于主席树,每次修改操作我们在之前基础上建一棵新树,但是他们的一些儿子是共用的,如果直接用线段树的lazy标...
由于有不同时刻的数组,即对应不同个历史版本,考虑用主席树 但是这样,主席树进行 操作的时候,公用节点都被修改,还是要新建树,空间不够 在结构体里记录一下 表示所有子区间的懒惰标记 修改的时候只在上层区间更新 ,不下传 查询的时候,维护一个 ,表示自顶向下的 ...
主席树区间修改了,每一次遇到整区间就打永久化标记(不下传,访问的时候沿路径上的标记算答案)然后r e t u r n returnreturn,那么每修改一次只会访问到l o g n lognlogn个节点,再加上每个点要在树链上修改l o g n lognlogn次,所以空间复杂度O ( n l o g 2 n ) O(nlog^2n)O(nlog2n),实测...