数据结构
数据结构
等待闪电
这个作者很懒,什么都没留下…
展开
-
单调栈与单调队列
单调栈单调栈,顾名思义,就是存在栈的中数据符合某种单调性。常见的应用模型是求数组中某元素左边/右边第1个比其大/小的数。#include <iostream>#include <vector>#include <algorithm>using namespace std;const int N = 3000010;int st[N];int a[N];int tt; // 定义栈首指针vector<int> ans;int ma原创 2022-02-09 11:05:48 · 621 阅读 · 0 评论 -
树状数组模板
概述对于一个数组,当采用暴力做法时,修改其中某个元素的时间复杂度为O(1), 区间查询的时间复杂度为O(n), 当数据庞大且进行多次查询操作时,这是不可接受的。为此,可以使用一种叫树状数组的数据结构,使得单点修改和区间查询的时间复杂度均为O(logn). 思路对于某段区间和,我们可以先求区间两端的前缀和,然后用区间两端相减即可。于是问题就转化为了如何快速求出某个区间的前缀和,而树状数组就是把一些区间的和通过树组织起来。如下图:其中a表示原始数组,c表示树状数组,c[i]的意思表示以a[原创 2021-09-19 16:04:23 · 105 阅读 · 0 评论 -
线段树模板
概述当需要对一个区间进行查询与修改时,常规的操作的时间复杂度为O(n),其中n为区间长度。通过采用线段树这一数据结构,我们可以将时间复制度降低为O(nlogn)以下是示意图:对于每个区间,我们用一个节点进行维护,我们可以继续向下划分得到子区间做为该节点的孩子节点,直到无法再向下划分。这样每个区间的信息都可以从其子区间获取,而对于区间的修改,这需要对每个包含了该区间的节点进行修改。ps:在为节点数组开空间时要开4n空间(n为区间长度),这是因为虽然最后一层有n个节点满二叉树只有2n-1个节点,但由原创 2021-08-23 23:54:11 · 100 阅读 · 0 评论 -
哈希——开放寻址法, 拉链法与字符串前缀哈希
#include <iostream>#include <cstring>using namespace std;const int N = 200010, null = 0x3f3f3f3f;int h[N], n;int find (int x){ int k = (x%N + N) % N; while (h[k] != null && h[k] != x) { k++; if(k =.原创 2020-07-18 11:29:32 · 890 阅读 · 0 评论 -
trie——字典树模板
#include <iostream>using namespace std;const int N = 20010;int son[N][26], cnt[N], idx; // son[i]数组存放存放第i个节点其各个子节点的下标, cnt数组表示以该节点结尾的单词数, idx表示当前节点序号void insert(char str[]){ int p = 0; // 根节点 for (int i = 0; str[i]; i++) {原创 2020-07-22 11:12:19 · 269 阅读 · 0 评论