随笔分类 - 数据结构
摘要:用树状数组求逆序对的时候注意:要统计b[i] 1的前缀和,因为可能有相同值的元素 不去重离散化: c++ sort(a+1, a+n+1, cmp); for(int i=1; i include include include using namespace std; const int MAXN
阅读全文
摘要:对顶堆,维护第k大 考虑维护一个大根堆,一个小根堆。 这两个堆总大小为当前区间长度,我们维护两个性质: 1.小根堆总比大根堆多一个元素 2.小根堆所有元素都大于大根堆元素 这样小根堆的堆顶就是区间中位数。 当需要加入一个新元素时,如果这个元素比小根堆堆顶要大,就加入小根堆中,反之则加入大根堆,这样可
阅读全文
摘要:问题是求一个数往右边看,在遇到大于等于他本身的之前,有多少个比他小的数 正难则反,转化问题为一个数能被多少个数看到,算贡献,那么这些的和就是答案 用单调栈去处理,把栈里的比当前处理的数要小于等于的全弹掉,剩下的那些就是严格比这个数大的,也就是可以看到这个数的 ans要开long long c++ i
阅读全文
摘要:注意这X家不一定连续,并且输入中给定的就是第i家到入口的距离 先想只有一个的情况,扫一遍,找到其中最大的那个(路径要乘上2) 两个的呢?不大好想,不如想想n个的时候,情况最简单,那么从n到n 1的转移也很简单 考虑把过程反过来,一个个删点,每次删使得答案变化最小的点 现在问题是 快速找出区间内对答案
阅读全文
摘要:这种矩形问题常用单调队列优化枚举(通过贪心取最优降低了一个维度的枚举) 推荐这道题也要做一做:[\[ZJOI2007\]棋盘制作][1] 单调队列的空间记得开大点! 反正内存够用 注意,这题正方形边长是固定的! 暴力算法是枚举上边界所在的行,左边界所在的列,通过这两个个信息确定一个正方形,然后预处理
阅读全文
摘要:我写线段树的时候因为不想用define所以先写好一行 然后复制下来,每次用的时候粘贴。。。 注意输入的值有负数,求最值的时候注意点。。。 c++ include include include include include using namespace std; define debug(x)
阅读全文
摘要:fhq treap多么强劲。。。 当用无旋treap解决区间/序列问题时,其实每个点所存的值不再对树的形态产生影响,复杂度由随机优先级和堆结构来保证。这棵 树不是以点的值为关键字,只是按照操作把一些点进行了修改 ,使得任何时候对这棵树进行中序遍历,都能得到最新的书架(序列)状态 在节点中,存下书的编
阅读全文
摘要:平衡树维护被毁坏的房子就好了 set可以水过。。。注意边界问题 c++ include include include include include include include using namespace std; define debug(x) cerr
阅读全文
摘要:先考虑在链上的做法,线段树子节点合并的时候减去重复算的颜色,然后树剖,跨越轻链的时候可以单点查询找颜色(我想的是维护颜色。。。但是明显这个点也是在线段树上的,直接单点查询就好了, 想想问题的本质是什么 ,有没有不那么麻烦的做法) 所以要考虑好一些问题的区间可维护性,然后选用适当的数据结构 比如区间最
阅读全文
摘要:st表细节多。。。 用线段树维护也行,会慢一点 最大公约数这个东西区间上是“可加”的 所以可以很方便地合并出区间gcd 注意位运算优先级低,多加括号 c++ include include include include include using namespace std; const int
阅读全文
摘要:首先最好要会写treap(也先了解一下笛卡尔树是什么。。。) fhq treap和treap同样有一个随机分配的rnd值,用于平衡,但fhq treap不需要旋转操作来维持平衡,因为有两个神奇的操作merge和split 在两种操作之前,要明确的一点是fhq treap依靠rnd值来维护平衡,把每个
阅读全文
摘要:记得及时更新sum(每次修改都更新),写成一个update函数比较好,因为很多时候会忘了% 还有懒标记是标记在这个点本身上的 然后就是左儿子和右儿子一定要看清楚。。。 一个是n 2 ,一个是 n 2 + 1 ,涉及到这部分的代码一定要专注 乘法标记优先级大于加法,并且对加法标记也有作用 若要增加加法
阅读全文
摘要:这题想得脑阔疼。。。我只想到可以选一个点,或者不选这个点选其左右两个点的和 先来特殊情况 ,k=1, 然后k=2 可以发现由1到2的过程中,可以是一个本来被选的点,替换为他左右两边的点,收益 增加了 a[pos+1] + a[pos 1] a[pos] 这个题是一个个选,直到选了k个,有种递推的感觉
阅读全文
摘要:开n棵平衡树,慢慢合并成一个,用并查集处理连通关系,平衡树处理第k大就好了 因为重要度是不会有重复的,而且是从1到n的,可以开一个数组,表示重要度为k所对应的编号 如何合并? 要善于把一个新问题转化为一个已解决过的问题 我甚至想自己搞出一个新算法处理连通关系,但是用并查集不就好了吗 思维定势:一个题
阅读全文
摘要:是真的染色,把不同预约看做不同颜色,现在问题就是一个区间内不同颜色的数量,这个分块线段树都能做吧(不考虑复杂度用莫队也行) 注意,线段树的最大边界必须是定值,不能随输入改变(一开始懒得离线动态更新右端点然后节点的编号就串了) 注意数组大小,因为same和tag数组都是针对线段树节点设置的,所以其数组
阅读全文

浙公网安备 33010602011771号