摘要: 普通二叉树与平衡树初步 无旋Treap,Treap,Splay 见题库-网课-Treap和Splay。 普通平衡树 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入数值x。 删除数值x(若有多个相同的数,应只删除一个)。 查询数值x的排名(若有多个相同的数,应输出最 阅读全文
posted @ 2020-10-23 19:15 林生。 阅读(70) 评论(0) 推荐(0)
摘要: 点分治 树 给定一个有N个点(编号0,1,…,N-1)的树,每条边都有一个权值(不超过1000)。 树上两个节点x与y之间的路径长度就是路径上各条边的权值之和。 求长度不超过K的路径有多少条。 输入格式 输入包含多组测试用例。 每组测试用例的第一行包含两个整数N和K。 接下来N-1行,每行包含三个整 阅读全文
posted @ 2020-10-23 19:13 林生。 阅读(56) 评论(0) 推荐(0)
摘要: 分块 将数组分为N½块,算出每块对应的满足条件的值,在暴力的基础上提升效率。 蒲公英 在乡下的小路旁种着许多蒲公英,而我们的问题正是与这些蒲公英有关。 为了简化起见,我们把所有的蒲公英看成一个长度为 n 的序列a1,a2,…,ana1,a2,…,an,其中aiai为一个正整数,表示第 i 棵蒲公英的 阅读全文
posted @ 2020-10-23 19:10 林生。 阅读(141) 评论(0) 推荐(0)
摘要: 主席树 1.普通主席树 静态区间查询第k大的数。 对于一个长度为n数组,数值离散化之后范围为1~\(s[0]\),则开n棵范围s[0]棵线段树,每次查询l,r区间时,取出树r和树l-1进行计算,树r-树l-1得到的就是树l-r的值。 但由于每个点开一个线段树内存消耗很大,同时易知每棵树和前一棵树相比 阅读全文
posted @ 2020-10-23 19:02 林生。 阅读(66) 评论(0) 推荐(0)
摘要: 线段树 即对数组进行二分保存。 由图易得,除去最后一层,树的深度为$log$2\(N\),则树的大小约为$N2$≤​20+21+22+……+2log2N/2<\(N*4\),但在一些特殊的图上,可能会大于$N4$,所以一般而言,线段树数组开到N*8的大小。 主要操作 1.单点修改 注意左右节点和父节 阅读全文
posted @ 2020-10-23 18:56 林生。 阅读(106) 评论(0) 推荐(0)
摘要: 树状数组 树状数组即利用二进制进行储存,若x的最低位1在第i位,则x储存x-2i~x的数值,可利用二进制进行快速修改与查询。 树状数组便于快速查询前缀和,查询和修改的复杂度皆为$O(log2N)$,而普通前缀和查询的复杂度为$O(1)$,但修改的复杂度为$O(N)$,效率太低。 一维树状数组 修改函 阅读全文
posted @ 2020-10-23 17:48 林生。 阅读(136) 评论(0) 推荐(0)
摘要: 并查集 将满足某一条件的值加入同一集合 int x=find(u),y=find(v); f[x]=v; 查找函数 void find(int x) { return f[x]!=x?f[x]=find(f[x]):x; } 普通并查集 银河英雄传说 有一个划分为N列的星际战场,各列依次编号为1,2 阅读全文
posted @ 2020-10-23 17:40 林生。 阅读(100) 评论(0) 推荐(0)
摘要: 搜索的本质是模拟。 ###P1092 虫食算 #include<bits/stdc++.h> using namespace std; const int N=30; string ss; int n,val[N],s[4][N]; bool use[N]; void dfs(int x,int y 阅读全文
posted @ 2020-10-23 17:38 林生。 阅读(111) 评论(0) 推荐(0)