随笔分类 - 线段树
摘要:E Boring Segments 双指针加线段树; 线段树维护区间覆盖问题,具体来说每个节点维护区间被完整覆盖的最小次数; 先将线段按照权值从小到大排序,seg[i]指下标i所对应的线段; 对于双指针l,r来说,r向右移的同时将seg[r]对应的线段覆盖,直到覆盖掉整个区间[1,m],此时再右移l
阅读全文
摘要:题链 对于一个区间有如下数字{5,6,7,8},他们的二进制表示分别为: 5:0101 6:0110 7:0111 8:1000 那么这区间数的总和可以这么计算: 1*(23) + 3*(22) + 2*(21) + 2*(20); 其中(2^i)次方前的系数就是第i位的1的个数之和 将他们异或上一
阅读全文
摘要:题链 线段树维护矩阵模板题 #include <bits/stdc++.h> //#pragma GCC optimize(2) using namespace std; #define LL long long #define ll long long #define ULL unsigned l
阅读全文
摘要:题链 树剖板题 #include <bits/stdc++.h> using namespace std; #define ls rt<<1 #define rs rt<<1|1 #define LL long long #define PI acos(-1.0) #define eps 1e-8
阅读全文
摘要:题链 树链剖分模板题,注意ai数据范围就好 //#include <bits/stdc++.h> #include <iostream> #include <vector> using namespace std; #define ls rt<<1 #define rs rt<<1|1 #defin
阅读全文
摘要:题链 求其前缀和,对于每一个i,可选值的范围是[i+L-1,i+R-1],假设选了pos,那么得到的贡献就是a[pos]-a[i-1],也就是说需要选择前m大的值相加; 如果对于一个i,我在它可选值范围内选了pos,得到贡献后,对于i的下一个最大值可能在[i-L+1,pos-1]内,或者[pos+1
阅读全文
摘要:题链 题意:判断序列能否选择c个数字同时-1并执行s次,操作单点修改; 对于序列中>=s的数字,相当于那些数字就等于s,毕竟执行s次也不会把这些数字删成0; 结论就是八那些超过s的数字看作s,如果序列的总和>=c*s的话,就是可行的,否则不可行; 把每个数想象成不同颜色的楼房,比如 7 9 3 2
阅读全文
摘要:题链 可将询问按L从小到大排序,每次将序列中花朵第二次出现的位置置为1,用树状数组维护; --树状数组 //#include <bits/stdc++.h> #include <iostream> #include <algorithm> #include <ctime> #include <cma
阅读全文
摘要:题链 线段树维护区间最大字段和; 讲的非常好 #include <bits/stdc++.h> using namespace std; #define ls rt<<1 #define rs rt<<1|1 #define LL long long #define ll long long #de
阅读全文
摘要:题链 线段树维护节点从左边最大,从右边最大,最大子段和,总和,区间最大值; 如果区间最大值小于 0,输出区间最大值; 否则输出最大子段和; #include <bits/stdc++.h> using namespace std; #define ls rt<<1 #define rs rt<<1|
阅读全文
摘要:# 题意 题链 题意:定义一个数字 num 在一个数组中的贡献为 最后一次出现的下标 减去 第一次出现的下标; 定义一个数组的价值 cost 为该数组中出现过的数字 num 的价值总和; 如数组 [2,2,3,2,3],cost = (4-1)+(5-3) = 5; 给定 n ,m,以及长度为 n
阅读全文
摘要:题链 原来这才是可持久化的基础之基础 #include <bits/stdc++.h> //#include <ext/rope> //using namespace __gnu_cxx; using namespace std; #define LL long long #define ll lo
阅读全文
摘要:题链 dp[x] 表示以 x 为进化终点能取得的最大进化次数; 可以发现 dp[x] 等于 树上x的前缀最大值 +1; 但是不可能递归寻找x的父亲直到根节点,因为会超时; 所以采用重链剖分+线段树维护前缀最大值,复杂度O(nlogn*logn); #include <bits/stdc++.h> u
阅读全文
摘要:题链 学习自大型同性交友网站,这个B 站up主讲的非常好! 终于学会了第一个维护树上问题的方法,我好兴奋啊! #include <bits/stdc++.h> using namespace std; #define LL long long #define ll long long #define
阅读全文
摘要:题链 对于每一个a[i]可以记录它上一次出现的位置; 1.可以用树状数组解(离线):对询问排序(询问的r从小到大),右指针移动则add(R,1),然后对a[R]上一次出现的位置add(pos,-1),对于一个询问则是query(r)-query(l-1); 2.可以主席树记录原数组下标方式解(在线)
阅读全文
摘要:答案是对着这段区间 [L,R] 不断询问直到不存在 x+1 得来的; 例如一个区间有为 1,2,4,4; 首先询问 1,发现存在 1,ans = 1; 然后询问 ans+1 = 2,发现存在 2,则 [1,3] 都能凑出,ans = 3; 接着询问 ans+1 = 4,发现存在两个 4,则 [1,1
阅读全文
摘要:题链 分析 前50%的数据 val[i][j][k] 表示 [1,1][i,j] 大于等于 k 的值 的总和; size[i][j][k] 表示 [1,1][i,j] 大于等于 k 的值 的个数; 在 [1,1000] 之内二分查找; 后50%的数据 建立主席树(可持久化权值线段树),节点信息除了左
阅读全文
摘要:本题使用动态开点权值线段树... 数据返回是 [-1e7,1e7] ,所以将其 +(1e7+1) 让范围映射到 [1,2e7+1] ,这样就在 [1,2e7+1] 构建权值线段树,记 2e7+1 为 MAXN; 先考虑前面 4 种操作 插入和删除操作就是在线段树的叶子节点(递归的最底层)的位置 +-
阅读全文
摘要:普通线段树是预先处理出值域的范围。像二叉树一样建树,有时通过将所给序列离线离散化以减小普通线段树的值域。 当所给序列不允许离线而且值域比较大时,动态开点线段树可以 O(nlogm) 维护线段树,m 是值域,假象一开始有一颗 [1,m] 的线段树,当然是不去建它的。 对于普通线段树都有修改操作,则如将
阅读全文
摘要:OI-wiki 题链 向下推的时候是类似向下推懒惰标记的方式,没理解导致吃了一整页的WA #include <bits/stdc++.h> //#include <ext/pb_ds/priority_queue.hpp> //#pragma GCC optimize("O2") using nam
阅读全文

浙公网安备 33010602011771号