数据结构
文章平均质量分 93
并查集
二叉树(二叉树、二叉搜索树、treap树、Splay树)
线段树
树状数组
lllllan.
盛意以江河,江河不及你
展开
-
树形相关
文章目录对【树】的大概认识树的定义树的种类相关术语二叉树的遍历【树形相关】的回顾线段树最小生成树最近公共祖先今天的学习树上差分【差分】与【前缀和】树上差分 对【树】的大概认识 树的定义 【百度百科上是这样说的】 树,木本植物之总名,主要由根、干、枝、叶、花、果组成。 树是一种数据结构,它是由n(n>=1)n(n>=1)n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个结点有零个原创 2021-02-10 18:05:07 · 142 阅读 · 0 评论 -
The 17th Zhejiang Provincial Collegiate Programming Contest C. Crossword Validation【字典树】
C. Crossword Validation 题意: 给你一个n ∗ n 的矩阵和m个单词以及单词的权值,问矩阵中横着和竖着的,有#隔开的极长单词是否都在给你m个单词中出现过,以及它们的权值和是多少。 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 4e6 + 10; int cnt, _T, n, m; int w[N], trie[N][26]; char m...原创 2020-11-21 13:03:36 · 385 阅读 · 0 评论 -
关于并查集!
并查集详解 (转) 并查集(Union-Find)算法介绍 带权并查集 种类并查集 我的并查集模板 题目 题目 题解 题型 HDU 1272 小希的迷宫 题解 并查集 POJ1611 The Suspects 题解 并查集 CodeForces - 371D Vessels 题解 并查集 HDU 1598 find the most comfortable road 题解 枚举+并查集 POJ1456 Supermarket 题解 贪心+并查集 POJ1182 食物链 题原创 2020-11-18 18:46:46 · 91 阅读 · 0 评论 -
2015 长春赛H && HDU5536 Chip Factory【01字典树求异或模板】
Chip Factory 题意: 给你nnn个数字,求maxi,j,k(si+sj)⨁sk,i≠j≠k\mathop{max}\limits_{i,j,k}(s_i+s_j){\bigoplus}s_k,i\not=j\not=ki,j,kmax(si+sj)⨁sk,i=j=k。 题解: 01字典树是求异或最大值的利器。这里我们可以先将所有数字插入字典树中,然后枚举i,ji,ji,j,先将i,ji,ji,j对应的数字从字典树中删除,找到最大值,然后再插入回去,这样就在能O...原创 2020-11-08 18:35:53 · 97 阅读 · 0 评论 -
字典树
回顾一个常见的字符串匹配问题,在n个字符串中查找某个字符串。如果用暴力的方法需要逐个匹配每个字符串,其复杂度是O(nm),m是字符串的平均长度。这个操作的效率十分低。那么解决这个问题较快的办法是: 字典树 时间复杂度:插入和查找单词的复杂度都是O(m),其中m是待插入/查询的字符串的长度。 空间复杂度:有公共前缀的单词只需要存一次公共前缀,节省了空间。 基本性质: 根节点不包含字符,除根节点外的每个子节点都包含一个字符。 从根节点到某一个节点,路径上经过的字符连接起来为对应的字符串。 每个节点的原创 2020-07-27 23:59:15 · 119 阅读 · 0 评论 -
01字典树模板
const int maxn = 10000 + 5; //集合中的数字个数 int ch[32 * maxn][2]; //节点的边信息 int sz[32 * maxn]; //出现次数 ll val[32 * maxn]; //节点存储的值 int cnt; //树中当前节点个数 void init(){ cnt = 1; memset(ch[0], 0, sizeof ch[0]); } vo原创 2020-11-06 14:27:48 · 181 阅读 · 1 评论 -
HDU3999 The order of a Tree【二叉搜索树 + 前序遍历】
The order of a Tree 题意: 给定一个二叉搜索树的插入顺序,要求输出建树之后的前序遍历。 题解: 连续第二天做到二叉搜索树了,真的吹爆这个算法,从二叉树啥也不懂,到简单搜索树直接秒杀,全靠这个模板。 #include<bits/stdc++.h> using namespace std; int n, x; vector<int> ans; void build(vector<int> tree) { if(tree.size() =...原创 2020-11-02 11:09:10 · 203 阅读 · 0 评论 -
HDU3791 二叉搜索树【建树】
二叉搜索树 题意: 给定一棵二叉搜索树的序列,判断其他的序列是否和这个序列构造成相同的二叉搜索树。 题解: 前不久刚学到一篇不错建树方法,所以仿造了类似的思路,将给定的序列按照后序遍历建树(前序也可,中序貌似不行)——实际上就是按照后续遍历将所有节点存放在数组中。如果将所有的序列按照后续遍历建树的话,那么只有数组中元素相同的序列才可能构造成相同的二叉搜索树。 #include<bits/stdc++.h> using namespace std; typedef long lon...原创 2020-11-01 10:35:58 · 172 阅读 · 0 评论 -
CodeForces - 339D Xenia and Bit Operations【线段树】
CodeForces - 339D 题意: 给定n和m,给你一个包含2^n个数的数组,交替对这些数进行“或操作”和“异或操作”,得到最终的结果。有m次操作,每次操作先将p位置的数修改为v。 题解: 线段树单点修改,唯一特别的是在pushup中返回一个标记,如果上回进行了或操作,这次改为异或。用0和1表示。 从别人哪里学来的骚操作:#define lrt rt << 1 类似这些都会 反复使用,通过#define记为另一种容易写的标识,可以加快写题的速度。 #include<...原创 2020-10-29 15:35:45 · 132 阅读 · 0 评论 -
树的重心
定义: 树的重心也叫树的质心。找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡。 性质: 1. 树中所有点到某个点的距离和中,到重心的距离和是最小的,如果有两个重心,他们的距离和一样。 2. 把两棵树通过一条边相连,新的树的重心在原来两棵树重心的连线上。 3. 一棵树添加或者删除一个节点,树的重心最多只移动一条边的位置。 4. 一棵树最多有两个重心,且相邻。 求法: 定义dp[i]表示以 i 为根节点的子树的大小。若节点 i 的子节原创 2020-09-22 19:37:45 · 128 阅读 · 0 评论 -
并查集模板
(继续声明,搬自我本人PigySu博客园的文章 模板一:kk给出的有路径压缩的模板 #include<bits/stdc++.h>//万能头文件 using namespace std; const int maxn=1010; int fa[maxn]; void init(){ int n=1000; for(int i=1;i<=n;i++){ fa[i]=i; } }//赋初值 int find(int x){ retu.原创 2020-07-29 09:31:09 · 147 阅读 · 0 评论 -
HDU4585 Shaolin——map、treap
传送门 Problem Description Shaolin temple is very famous for its Kongfu monks.A lot of young men go to Shaolin temple every year, trying to be a monk there. The master of Shaolin evaluates a young man mainly by his talent on understanding the Buddism scriptur原创 2020-07-26 23:52:14 · 147 阅读 · 0 评论 -
HDU 2795 简单线段树问题
传送门 Problem Description At the entrance to the university, there is a huge rectangular billboard of size h*w (h is its height and w is its width). The board is the place where all possible announcements are posted: nearest programming competitions, changes原创 2020-07-22 22:31:51 · 136 阅读 · 0 评论 -
线段树水题打卡——hdu1754\hdu1166
hdu 1754 #include<bits/stdc++.h> using namespace std; const int N = 200001 * 4; const int M = 5001; int n,m; struct node{ int l, r, val; }; node stu[N]; int a[N]; void pushup(int i){ stu[i].val = max(stu[i << 1].val, stu[(i << 1) | 1原创 2020-07-22 22:04:45 · 70 阅读 · 0 评论 -
POJ 2182 Lost Cows——线段树
传送门 Description N (2 <= N <= 8,000) cows have unique brands in the range 1…N. In a spectacular display of poor judgment, they visited the neighborhood ‘watering hole’ and drank a few too many beers before dinner. When it was time to line up for their原创 2020-07-20 22:09:15 · 104 阅读 · 0 评论 -
POJ - 3468 和 POJ - 2823两道线段树模板题
POJ 3468 #include<iostream> #include<algorithm> using namespace std; const int N = 100005; typedef long long LL; int n, q; LL a[N]; //a[N]储存原数组 LL lazy[N << 2]; //空间应该开区间的四倍 //!!!懒惰标记(在节点上标记该区间内的所有节点的增量,非必要时不必更新区间内点的sum,以减小时间复杂度原创 2020-07-20 21:55:02 · 75 阅读 · 0 评论 -
HDU 3016 Man Down——线段树
传送门 Problem Description The Game “Man Down 100 floors” is an famous and interesting game.You can enjoy the game from We take a simplified version of this game. We have only two kinds of planks. One kind of the planks contains food and the other one contai原创 2020-07-20 21:50:02 · 148 阅读 · 0 评论