随笔分类 - 算法合集 / 数据结构
发表于 2024-07-30 03:04阅读:16评论:0推荐:0
摘要:定义 线性基用于解决类似于: "给定 个数, 取任意个数, 使得异或值最大"此类问题 本质上还是求出多个数最大和最小的异或和,由于给出的数目较大, 如果直接一一比较的话时间复杂度较大,可以通过线性基优化, 假如有 个, 其中最大的数二进制位数为 位, 那么线性基可
阅读全文 »
发表于 2024-07-14 19:47阅读:28评论:0推荐:0
摘要:引言 第一次接触树链/重链剖分的时候还是学习 , 没系统性的看过剖分, 今天刚重新学习了一下, 还是比较神奇的, 没想到一个树形结构能有这么多种神奇的操作, 总的来说, 树链剖分还是比较重要的一个策略 正文 定义 先给出图示 首先我们给出以下几个定义: 重儿子, 对于一个非叶子节点,
阅读全文 »
发表于 2024-07-12 03:17阅读:60评论:0推荐:0
摘要:介绍 点分治, 作为一种统计带权树简单路径长度的暴力分治算法, 其分治方法非常的巧妙, 可以将暴力的 优化到 先看问题: 在一个带权树上, 统计两个点的简单路径长度不超过 的路径个数 这就是 模板题1 POJ1741 首先还是考虑如何使用暴
阅读全文 »
发表于 2024-06-11 12:56阅读:16评论:0推荐:0
摘要:基环树简单介绍 目录#1.0 啥是基环树?#1.1 无向图上的基环树#1.2 有向图上的基环树#1.2.1 内向树#1.2.2 外向树#2.0 基环树的一般处理思路#2.1 大体方法#2.2 找到环#2.2.1 思路#2.2.2 代码实现#2.3 剩下的操作#3.0 例题#3.1 [IOI2008]
阅读全文 »
发表于 2024-06-07 17:31阅读:30评论:0推荐:0
摘要:对于树上的两点之间的简单路径,求经过边权值的最大异或和 首先考虑一个点到根节点所经过路径的异或和,可以深搜求出 考虑两点简单路径的异或和,其值一定是两个点分别到根节点的异或和的异或,那么此时我们已知一个点,如果求出另一个点使得两点之间的异或和最大呢? 考虑字典树存取,深搜完之后,将每个点到根节点的异
阅读全文 »
发表于 2024-05-27 23:58阅读:22评论:0推荐:0
摘要:重构一下线段树的博客,关于线段树的相关定义以及证明过段时间再补 首先是一个简单线段树,这里叫做伪线段树,其实本质就是一个二叉树,仅能支持单点操作: 单点修改 + 区间查询 // 单点修改查询 // http://ybt.ssoier.cn:8088/problem_show.php?pid=1549
阅读全文 »
发表于 2024-04-26 16:19阅读:9评论:0推荐:0
摘要:树状数组三倍经验 P1637 三元上升子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Enemy is weak - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) The Battle of Chibi - 洛谷 | 计算机科学教育新生态 (luogu.co
阅读全文 »
发表于 2024-04-21 18:04阅读:20评论:0推荐:0
摘要:先挂个板子: #include <bits/stdc++.h> #define int long long using namespace std; const int N=1e6+10,mod=1e9+7; mt19937 sj(114514); struct node{ int l,r,key,
阅读全文 »
发表于 2024-04-15 10:47阅读:10评论:0推荐:0
摘要:什么时候用分块? 当你发现正常数据结构无法解决的时候(比如维度特别多,很不方便或者炸空间),或者复杂到要3个 以上才能解决时。(主要还是得看数据范围,分块的做法一般都是 及以上的 如何分块? 定一个块长 ,整个序列就会被分成
阅读全文 »
发表于 2024-03-27 12:01阅读:11评论:0推荐:0
摘要:以为自己一辈子接触不到的算法,本来以为很高深,没想到是优雅的暴力,太绝妙了 对于多个区间查询,例如区间最大值等,我们考虑暴力,枚举区间 ,取最大值即可,时间复杂度 ,跑不起,所以我们借用数据结构,单调队列,树状数组等等,但是如果此时我们考虑优化暴露 首先我们这样
阅读全文 »
发表于 2024-02-06 16:36阅读:17评论:0推荐:0
摘要:首先是单调队列: 其实单调队列就是一种队列内的元素有单调性(单调递增或者单调递减)的队列,答案(也就是最优解)就存在队首,而队尾则是最后进队的元素。因为其单调性所以经常会被用来维护区间最值或者降低 的维数已达到降维来减少空间及时间的目的。 类似于滑动窗口等,单调队列具有时序性的储存区间最大值或
阅读全文 »
发表于 2023-11-12 15:21阅读:28评论:0推荐:0
摘要:【动态规划】滚动数组的求解(C++) - 林、Zephyr - 博客园 (cnblogs.com) 【精选】滚动数组(简单说明)_儒rs的博客-CSDN博客 //https://www.luogu.com.cn/problem/P2679 /* # 定义状态 # 对于任意一个 0 <= i <= n
阅读全文 »
发表于 2023-09-25 15:15阅读:94评论:0推荐:0
摘要://https://www.luogu.com.cn/problem/P3865 //类似于动态规划和压状dp //f[i][j]是从i位置开始到i+2^j-1的区间内的最大值,一步一步更新所有区间的最大值 //有距离限制,即到达某一位置时,j可能过大导致越界,所以对与每个i,有区间属于:[1,n-
阅读全文 »
发表于 2023-09-06 14:07阅读:12评论:0推荐:0
摘要:声明一个multiset,按升序排列,默认升序排列 multiset<int>set1; 等价于: 或 multiset<int,less<int>>set1; 声明一个multiset,按降序排列 multiset<int, greater<int>>set1; 函数 用法 作用insert()
阅读全文 »
发表于 2023-09-05 12:14阅读:59评论:0推荐:0
摘要:节点(Node):树形结构中的基本单位,可以表示数据元素或对象。节点可以包含一个或多个子节点。 根节点(Root Node):树的顶层节点,它没有父节点,是整个树的起点。 子节点(Child Node):树中每个节点都可以有零个或多个子节点,子节点是位于其父节点下方的节点。 父节点(Parent N
阅读全文 »
发表于 2023-08-13 13:38阅读:52评论:0推荐:0
摘要:调了整整5个小时,结果发现自己建树的方式有误,气死我了气死我了,比较好的一道线段树(虽然我不会 #include<bits/stdc++.h> using namespace std; const int N=1e6+10; int n,m,res,point; vector<int>v[2]; /
阅读全文 »
发表于 2023-08-06 10:25阅读:15评论:0推荐:0
摘要:树的重心:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡。使得以该节点为根的子树中,最大子树高度最小的节点 //会议 //https://www.luogu.com.cn/problem/P1395 // f数组:f数组用于记录以每个节
阅读全文 »
发表于 2023-07-22 11:46阅读:8评论:0推荐:0
摘要://单点修改查询 //http://ybt.ssoier.cn:8088/problem_show.php?pid=1549 //https://www.luogu.com.cn/problem/P1198 //用一维数组来存,当作完全二叉树来存 #include<bits/stdc++.h> us
阅读全文 »
发表于 2023-07-20 14:54阅读:3评论:0推荐:0
摘要://树状数组 //利用lowbit函数将区间划分为以二进制结尾的长度的小区间,然后利用这些小区间相加,减少时间复杂度 //树状数组的本质就是前缀和+可修改区间,求单点前缀和,如果是求某一的区间和,需要稍加修改,下面有类似例题,维护前缀和还有i*前缀和就可以 //也就是说树状数组就是更快一点的前缀和,
阅读全文 »
发表于 2023-06-18 20:34阅读:20评论:0推荐:0
摘要:kmp算法用于优化字符串匹配效率: //KMP字符串匹配: //模板: #include<bits/stdc++.h> using namespace std; const int N=1e6+10; char s1[N],s2[N]; int ne[N],n,res; int main() { s
阅读全文 »