
数据结构
zipper112
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
ST表
非常小巧好用的数据结构,在处理静态的RMQ非常有力思想思想就是伟大的 倍增思想,O(nlogn)O(nlogn)O(nlogn)的预处理O(1)O(1)O(1)的查询。预处理设数组maxx[i][j]maxx[i][j]maxx[i][j]为从i开始长度为2j2^j2j的区间内的最大值那么maxx[i][j]=max(maxx[i][j−1],maxx[i+2j−1][j−1])maxx[i][j] = max(maxx[i][j - 1], maxx[i + 2^{j - 1}][j-1])ma原创 2020-09-05 14:51:45 · 146 阅读 · 0 评论 -
模拟哈希表&字符串哈希
模拟哈希表引入哈希表就是根据一个关键值key进行高效访问的数据结构,可以通过哈希函数把一个数据当做key进行映射得到一个储存地址从而进行访问。比如想要查询100个数字范围在(1 ~ 1e8),查询它们是否有重复的值,那么就可以用哈希表来解决这个问题。对于小的数字我们就会习惯的会去一个数组进行标记,但是对于大的数字,开一个很大数组用来标记是很浪费空间,而且要处理的数只有100个,开一个1e8的数组实在是划不来,而且当数据再增大时,对于C++可能就无法直接开出这样的数组。哈希函数此时就可以对此些数字原创 2020-07-17 16:25:36 · 206 阅读 · 0 评论 -
智乃与无意义的题目
原题思路:我们知道对于一个整数N,我们一定可以把它分解成a1b1+a2b2+....+ambma_1^{b_1} + a_2^{b_2} + ....+a_m^{b^m}a1b1+a2b2+....+ambm(这里aia_iai全为素数)这就是唯一分解定理,除此之外我们还可以得到这么一个性质对于N的因子之和就等于(b1+1)∗(b2+1)...∗(bn+1)(b_1 + 1) * ...原创 2020-05-03 22:31:40 · 152 阅读 · 0 评论 -
倍增法求LCA(笔记)
LCA:lca就是最近公共祖先,对于上任意两个点,向上进项追溯,遇到第一个他们共有的祖先就是lca,注意,lca可以是两个点中的其中一个,也可以两个点重合。倍增算法:我们先考虑不适用倍增的做法,很自然我们能想到爬楼梯做法,即我们由两个点向上一层一层追溯O(n)的复杂度来找出lca。但是这样对多个查询一下子就T了,所以我们就考率在向上爬时做一下变动,我们之所以慢是因为我们爬的太慢,所以我们尝试...原创 2020-04-26 22:00:22 · 206 阅读 · 0 评论 -
DFS序 + 线段树
简单来说,就是利用dfs的连续性,把一棵树进行重新分配标号,最后把一棵树转化为一个区间用线段树或者树状数组维护的思维。例题核心部分:void dfs(int x,int f){ in[x] = ++tim;//tim相当一个时间戳和Tarjan类似 //in表示该节点的子树的所在新区间内的起始标号为in for(int i = h[x]; i != 0; i = tr...原创 2020-04-22 22:38:06 · 769 阅读 · 0 评论 -
线段树(笔记)
原理:线段树是一颗平衡二叉树,它的节点储存一个线段以及其它的一些信息,如图所示。树的存储:树的存储采用堆式存法,即存在数组里,对于节点u来说:u << 1 是u的左儿子u << 1 | 1是u的右儿子u >> 1 是u的父亲操作一,pushup操作pushup操作是由子节点计算父节点的操作,比如父节点区间内的最大值可以由左右儿子的最大值取ma...原创 2020-04-13 09:27:50 · 180 阅读 · 0 评论 -
POJ 2299 & POJ 2352
2299 :求逆序数对的模板题,一个序列的逆序对数等于把它冒泡排序所需要的交换的次数。#include<bits/stdc++.h>#define ll long long#define INF 0x3f3f3f3fusing namespace std;const ll maxn = 5e5 + 5;ll n,m,temp,num[maxn],num2[maxn];l...原创 2020-03-26 18:54:59 · 121 阅读 · 0 评论 -
树状数组(笔记)
问题:现在有一个要求,给出n个数和m次操作,每次操作可以是下列之一:插入操作:在nnn个数中的某一个数加xxx查询操作:查询nnn个数中第lll个数到第rrr个数的和对于这个问题,我们最直接的思路是暴力使用一个前缀和来进行维护,但是这样的话对于查询操作,是O(1)O(1)O(1)级别,但是对于插入操作最坏情况查询所有的数就是O(n)O(n)O(n)级别,那么最坏情况复杂度就是O(N2)...原创 2020-03-26 08:59:19 · 491 阅读 · 0 评论 -
Trie树(笔记)
Trie树是一种树形结构,可以用高效率的查找字符串出现的次数和插入一个字符串。构成:题目Trie树可以进行两种操作,一个是插入一个是查询,来看看这个题目然后想一下要怎么做。很明显,我们直接的思路肯定是暴力,两层循环然后枚举出最大组合,但是这样明显会超时。我们来贪心的考虑一下,我们先枚举出一个数,然后看哪个数可以和它异或最大,所以我们从这个数的高位开始考虑,如果这个数的高位是1,那么就找一下...原创 2020-03-20 18:42:21 · 115 阅读 · 0 评论 -
单调栈和单调队列
单调栈:题目先考虑暴力的做法,我们可以对每一个数枚举它左边的元素招到第一个小于它的即可。但是这种做法很慢,对于这种从自己出发找自己前面的元素的操作我们很容易想到栈这种数据结构。我们从开一个循环从左扫到右,依次把这些元素加入栈中并依次进行以下操作:如果栈为空则新加入的这个元素左边没有比它大的元素如果栈不为空且栈顶元素比新加入的大,则把栈顶元素出栈再次执行2操作,直到栈顶元素比新加入的小...原创 2020-03-12 19:55:57 · 82 阅读 · 0 评论 -
并查集(笔记)
并查集是一种树形结构,经常用于处理一些不相交集合的查询和合并,并且时间复杂度近乎O(1)。板子题题意:给一些编号从1到n的元素,每个元素一开始独自在一个集合中,然后可以对这些元素进行如下的操作:1. 给出两个元素编号a和b输出两个元素是否在一个集合中2. 给出两个元素编号a和b将两个元素所在的集合合并思路:如果使用普通的做法会如何? 我们可以用一个数组来储存哪个元素在哪个集合,执行操...原创 2020-02-26 15:15:15 · 129 阅读 · 0 评论