随笔分类 - 数据结构—树状数组与线段树
摘要:题目链接 思路: 这道题其实还是普通的区间修改和查询问题,只不过序列变为了环形,所以就是小小的改一下就可以了。 分类讨论一下,如果输入的l<r,那么就是照常修改和查询。但由于是环形,所以会出现l>r的地方,其实也就是这样拆成l-n和1-r两个操作即可。 代码,不需要代码,太水了 #include<b
阅读全文
摘要:题目链接 看这道题的时候,题目中的借教室我们可以看作是区间修改,如果有一天不符合的话都不行,第一反应就是线段树,维护最小值,查询的时候看是否满足要求,满足的话就区间修改。以此类推,直到出现不满足的情况。 但是由于常数问题还是要O2优化才能过,不然只有95分。 代码如下: #include<cstdi
阅读全文
摘要:challenge 0: 水题,暴力修改都能过。 #include<bits/stdc++.h> using namespace std; const int maxn=1000010; int n,m,k,p; char flag; int a[maxn]; int main() { scanf(
阅读全文
摘要:题目链接 读题发现,题目里有三种连边方式: 1.两点之间连一条有向边。 2.一个点与给定区间中的点连一条有向边。 3.给定区间中的点和一个点连一条有向边。 剩下的就是跑最短路。 两点之间连边很好处理,但是如何在区间之间连边?按平时链式前向星加边,最坏可能是n方的复杂度,建个边都要死。 这时就有线段树
阅读全文
摘要:题目链接 刘汝佳书上的题目,可以把矩形的每一行都开一棵线段树,最多也就20棵,空间也炸不了。然后就是线段树操作了。 注意:下传的时候最大,最小值也要更新。同样注意标记的优先级顺序。 代码如下: 1 #include<bits/stdc++.h> 2 using namespace std; 3 co
阅读全文
摘要:题目链接 偶然在讨论里看到这道题,就进来了。 看了一下发现是求区间的平均数及方差,所以肯定是要用线段树来维护的。区间平均数好求,直接求一遍区间和再除以区间长度就是了。 关键是区间方差的问题,做这题的时候还忘了方差是什么东西,真的sb,初中数学白学了。其实这样也比较可以。 手推一下就能够比较容易地发现
阅读全文
摘要:线段树区间异或,四倍经验,666。 关于线段树区间异或: 就是维护区间0的个数,1的个数,取反实际上就是把他们swap一下,总数不变,lazy标记改为^1即可 洛谷有四倍经验 给出题号:P2574,SP7259,P2846,P3870。 P3870代码如下: #include<bits/stdc++
阅读全文
摘要:题面 题解: 线段树合并的好题。在这题中我们可以用并查集维护连通块,因为要统计第k大,所以还可以用线段树合并来统计子树之间的信息。 坑点:1:注意炸内存 2:最后输出的是编号,要存起来 3:注意值域线段树中查询第k大的写法 代码如下: #include<cstdio> using namespace
阅读全文
摘要:线段树合并裸题,其实这道题就可以看作每一个点的子树中比它的点权大的值的个数。看这道题的值域范围,知道要用动态开点的线段树,然后我们可以将p数组离散化,每一个点都建一棵对应的值域线段树。最后从根节点开始遍历,回溯时将有上司和下属关系的点合并即可。 而关键是合并操作: 其实还是很好理解的,我的代码没有新
阅读全文
摘要:题目描述 有一个 n 个元素的数组,每个元素初始均为 0。有 m 条指令,要么让其中一段连续序列数字反转——0 变 1,1 变 0(操作 1),要么询问某个元素的值(操作 2)。 例如当 n = 20 时,10 条指令如下: 输入输出格式 输入格式: 第一行包含两个整数 n, m,表示数组的长度和指
阅读全文
摘要:有点意思,不需要什么懒标记之类的东西,因为一个数无论怎样开平方,最后取整的结果必然会是1,所以我们不妨用最大值来维护,若区间最大值不为1,就暴力修改,否则不用管。 多说几句,数据比较毒瘤,狂开unsigned long long 就能AC
阅读全文
摘要:震惊,双倍经验,依旧是线段树的乘法修改
阅读全文
摘要:线段树的模板,但是还应注意维护乘标记,乘法的优先级大于加法,一定记得还要取模。 真的还需要耐心啊!
阅读全文

浙公网安备 33010602011771号