随笔分类 -  dls的数据结构

摘要:将(i, a[i])当作点,对a[i]这个维度扫描,在i这个维度上面建立扫描线 #include<bits/stdc++.h> using namespace std; const int N = 2e5+10; array<int, 4> que[N]; array<int, 2> a[N]; / 阅读全文
posted @ 2022-04-27 13:08 牛佳文 阅读(55) 评论(0) 推荐(0)
摘要:例题1 #include<bits/stdc++.h> using namespace std; const int N = 2e5+10; typedef long long LL; const int M = 500; LL tag[M + 5][M + 5]; LL val[N]; int m 阅读全文
posted @ 2022-04-26 22:59 牛佳文 阅读(56) 评论(0) 推荐(0)
摘要:树链剖分 给定一个树,将一棵树分成几个链,每个点只能在一个链上(每个节(非叶子)点选一个儿子连下去) 剖法:长链剖分(找深度最大儿子子树连接),重链剖分(找子树大小最大的子树连接) 性质:一个节点不断地向上走,如果遇到了一条轻边,这条轻边的父亲节点的子树大小一定是会翻倍的 所以只会经过O(logn) 阅读全文
posted @ 2022-04-25 12:15 牛佳文 阅读(81) 评论(0) 推荐(0)
摘要:启发式合并 有n个集合,si = {i} 每次将两个集合sx, sy两个集合合并,做n - 1次变成一个集合 启发式合并就是维护每个集合是什么 并查集是相当于只是打了一个标记,查询的时候再把之前的标记更新好 启发式合并是将集合真的给合并在一起,然后删掉被合并的集合 并且保证每次都是小的集合合并到大的 阅读全文
posted @ 2022-04-22 18:17 牛佳文 阅读(81) 评论(0) 推荐(0)
摘要:倍增 1.求lca 2.log求k级祖先 3.lca:可以记录路径上的信息(没有修改的) 点上的和边上的都可以 并且这个信息需要容易使用倍增的形式进行合并(轻量级数据合并) // 维护路径上边的最小值 #include<bits/stdc++.h> using namespace std; cons 阅读全文
posted @ 2022-04-21 22:08 牛佳文 阅读(133) 评论(0) 推荐(0)
摘要:笛卡尔树 每次将序列中最小的数当成根,递归左右,对跟左边和右边递归地建树 最大的也是类似的 性质: 区间最小值:两个端点的lca的值 笛卡尔树的中序遍历是原数组(对一般的二叉搜索树都是成立的) 一个点,一路向上都是父亲的左儿子,然后再是一个的父亲的右儿子, 第一个左儿子是右边第一个大于等于他的,第一 阅读全文
posted @ 2022-04-14 12:55 牛佳文 阅读(186) 评论(0) 推荐(0)
摘要:二维数点 1. 两条限制,x1=<x<=x2, y1=<y<=y2, 我们可以将其转化成单边界的问题 2. 对于上面类似的问题都可以转换成扫描线的形式,在该题中扫y,对x进行计数 3. 也有离线的思想 4. 事件的思想 5. vx离散化只需要离散点的x就行了,其他的不需要离散,其中lowber_bo 阅读全文
posted @ 2022-04-03 14:41 牛佳文 阅读(98) 评论(0) 推荐(0)
摘要:lowbit运算 modify:下表不能有0 题目链接:http://oj.daimayuan.top/course/15/problem/636 一个log的树状数组二分 #include<bits/stdc++.h> using namespace std; typedef long long 阅读全文
posted @ 2022-03-30 14:18 牛佳文 阅读(49) 评论(0) 推荐(0)