数据结构
文章平均质量分 69
本居小鈴
无尽深渊中,唯有你与我共行。
展开
-
【数据结构】二维树状数组
LOJ 上二维树状数组的三道板子题原创 2022-10-05 14:53:53 · 878 阅读 · 0 评论 -
逆序对问题的简单求法
逆序对暴力求逆序对根据逆序对的定义,也就是,所有元素前面元素比它大之和,具体可以看下面的代码。long long solve(std::vector<int> & a) { long long ans = 0; for (int i = 0; i < a.size(); ++ i) for (int j = i - 1; j >= 0; -- j) if (a[j] > a[i])原创 2022-04-04 10:21:07 · 557 阅读 · 0 评论 -
【补题】UVA11992 Fast Matrix Operations(使用类包装的线段树)
UVA11992 Fast Matrix Operations题目传送门题目大意需要对一个初始全为0的矩阵进行操作。给定两个点,并执行下面三个操作:对给定两个点中间的范围加上val。将给定两个点中间的范围全部赋值为val。询问给定两个点中间的范围中所有元素的和和其中的最大值与最小值。矩阵不超过20行。思路因为矩阵不超过20行,可以考虑每一行直接开一棵线段树进行维护。区间加法与查询区间加法和查询很简单,只需要参照正常线段树,一颗一颗维护就行。要注意的一点,区间加法对于最大值和最小原创 2022-03-15 23:09:50 · 75 阅读 · 0 评论 -
【日志】旋转Treap
旋转TreapTreap树的名字来自于Tree+Heap,因为它结合了树(二叉搜索树)和堆(二叉堆)。(所以可以翻译为树堆?)。虽然感觉除了代码长点,这个旋转Treap也不是不好,但是fhp能做到的它做不到……虽然Treap相对简单,但是下面这行代码对写平衡树很有用。#define debug(x) std::cerr << #x << " " << x << '\n'结点性质在Treap中,各个结点的值val具有跟二叉搜索树一致的性质。同时,每原创 2022-03-12 22:23:13 · 1112 阅读 · 0 评论 -
【日志】珂学——珂朵莉树
珂朵莉树(珂学)珂朵莉树(或者老司机树)起源于CF896C。前置知识点STL中set的使用(list也行,但是效率差点)set的排序规则inserteraselower_bownd暴力使用珂朵莉树通过直接对区间进行暴力维护。不同于线段树或者树状数组对于区间的维护,珂朵莉树相当于直接把区间拆出来进行修改。下面的代码基于CF896C。定义珂朵莉树的定义如下:// using ll = long long;class ODT { private: class原创 2022-03-10 14:51:04 · 546 阅读 · 0 评论 -
【模板】带旋转的Treap模板
旋转Theap模板这是一种可行的旋转Theap模板(用了结构体包装,但是不一定是最好的)。简介Theap看名字就知道,Tree+Heap。其中,节点的val按照搜索二叉树排列,而关键的结点权值rank按照堆的规则排列。其中比较关键的就是旋转操作,跟AVL树类似。插入操作要维护一下rank。删除操作可以按照二叉树的删除或者堆的删除进行。一种可行的代码如下。class Theap { private: class Node { public:原创 2022-03-10 10:36:45 · 1053 阅读 · 0 评论 -
【日志】可持久化线段树2(静态主席树)
可持久化线段树求区间第kkk小值(主席树)例题:P3834 【模板】可持久化线段树 2考虑一个问题:给定nnn个数字,之后询问在[l,r][l,r][l,r]内的第kkk小的值是多少。暴力写法考虑暴力写法。简单来说,给这几个数字直接sort一下,就求到了。然后ttt组询问直接把时间复杂度卡上天。主席树主席树一种基于线段树的数据结构,全称是可持久化权值线段树(然而思想更重要)。对于求区间第k小,可以使用主席树(如果想尝试每一次都开一棵线段树也行,MLE)使用主席树求区间第k小问题先不考虑怎原创 2022-03-06 00:34:03 · 179 阅读 · 0 评论 -
【日志】特定条件下线段树暴力单点修改的小优化
特定条件下线段树暴力单点修改的小优化有的时候一些区间修改条件不符合区间的性质(比如加法在区间上可以以和为区间性质,但是众数不行)。但是某些特定的条件下可以借助其他的具有区间的性质的条件来优化暴力单点修改。CF438D The Child and Sequence传送门题意:实现区间取模、区间求和,单点修改。区间求和和单点修改很简单,但是问题在于区间取模。区间取模是一个不具有区间性质的条件。显然,对一堆数取模再累加的结果和对其和取模的结果一定是不同的。像这种操作显然只能暴力修改(当然也可以用优雅的原创 2022-03-02 00:01:14 · 55 阅读 · 0 评论 -
【日志】可持久化线段树
可持久化线段树前置知识:线段树可持久化线段树建立在线段树的基础上,通过只保存部分被影响的结点,从而保存历史版本线段树。因此祖传线段树的类似堆一样的存储方式是不能动态存入新的点的,需要动态开点。大致过程对于可持久化线段树,需要的也就是:动态开点其实就是事先开个大数组,然后找个变量增加结点即可。连接旧结点可以发现每次修改影响的结点就那几个。所以,可以对这些受影响的结点另开个结点,然后连接(比如右儿子+1的话,那么新开个结点,记录右儿子+1的结果,同理这个结点的信息也需要被记录,不过左儿原创 2022-02-28 09:10:51 · 98 阅读 · 0 评论 -
【日志】二叉堆
二叉堆二叉堆是一棵完全二叉树,其结点满足特定条件。(比如小根堆(或者小顶堆)中,父亲结点的权值不大于儿子节点)。c++的stl里面的priority_queue的底层实现数据结构即为二叉堆,但是平板电视里面的不是。下文都是基于数组实现的二叉堆,且根节点为1,也是以小根堆作为模板实现的。操作基础操作下面这两个操作的目的在于维护堆的性质。向上调整对单个结点进行调整。当前结点如果小于其父亲结点,就需要将其与父亲节点交换,直到不能替换为止。时间复杂度为O(logn)O(\log n)O(log原创 2022-02-28 00:51:24 · 454 阅读 · 0 评论 -
【日志】堆
文章目录堆代码堆二叉堆是一棵完全二叉树,一般用数组存储。如果根节点的下标为1,那么一个结点的左儿子就是它当前的位置*2,右儿子在此基础上+1。如果根节点的下标为0,那么在上面的基础上再+1即可。根据比较的不同(只要是关系都行,这里只列举大于和小于),可以分为大根堆和小根堆。堆用的很多的方面是优先队列,还有一种冷门的用法就是对顶堆。代码这里给的是像stl里面的priority_queue那样实现(只是稍微模仿了一下,并不是真正的priority_queue的实现,很多逻辑跟priority_原创 2022-01-12 15:53:03 · 221 阅读 · 0 评论 -
【日志】单调栈 单调队列
单调栈单调栈,其实就是维护栈里面的序列是单调的,当压入单调栈的元素将打破单调性的时,弹出里面的元素,直到将这个元素压入栈时能够满足单调性。vector<int>v;stack<int>s;for (int i = 1; i <= n; ++ i){ while (!s.empty() && v[s.top()] >= v[i]){ // 等于不等于看题目 s.pop(); } s.push(i);}原创 2022-01-08 10:11:14 · 466 阅读 · 0 评论