——数据结构————
文章平均质量分 72
Lazines_by
好吧,我要工作了
展开
-
codeforces 617E 莫队入门
莫队算法就是现将上所有的点分成sqrt(n)块,然后将要查询的区间离线起来,然后进行对[L,R]变到[L - 1,R] 、或者[L + 1,R],[L,R - 1],[L,R + 1]进行O(1)的变换。 莫队算法是优雅的暴力,复杂度O(nlogn)。 题意:给出一个一个数列,然后查询在给出区间的异或值等于k的子区间的个数。 思路:先对区间进行去前缀和处理,然后区间[L,R]的异或值为sum原创 2017-10-31 18:29:17 · 298 阅读 · 0 评论 -
poj3237(树链剖分边维护+线段树区间更新)
刚开始不会对边进行操作,刚开始一直WA,然后去写了一下spoj375,对边维护的规则熟悉了一下,然而终于发现了错在了哪,原来是要加上u != v。 区间更新的话就是用一个flag值代表,0代表不需取相反数,1代表需要。因为区间取的是最大值,然而最大值取相反数之后就是最小,最小数取相反数就是最大值。所以区间要维护一个最大值和一个最小值 //#include #include #inclu原创 2017-09-28 12:02:19 · 314 阅读 · 0 评论 -
spoj QTREE (树链剖分边维护)
边维护的话就是把n - 1条边转换为n - 1的点来表示,选用dep深度更大的那个点。 然后在区间维护和查询的时候都需要将u -> son[u]放线段树中,还要判断是都是u != v一般是开2-num长度的线段树 PS:刚刚一直不知边换成点的具体操作,跪了很多次 //#include #include #include #include #include using namesp原创 2017-09-28 11:34:01 · 202 阅读 · 0 评论 -
lightoj 1348 (树链剖分入门)
题意:修改一个节点上的点权,然后查询两个节点之间的路上的所有的节点的权值和。 思路:用树链剖分一下,然后直接写一个线段树维护一下区间和,更新直接在线段树上更新就行。 #include using namespace std; typedef long long ll; typedef pair P; #define fi first #define se second #define原创 2017-09-23 09:00:32 · 199 阅读 · 0 评论 -
区间第k大(主席树)
学了一下主席树模板题,当初看了网上的主席树讲解都没有看懂,后面看了哔哩哔哩的uestc的主席树,终于看懂了思想。每次更新的复杂度都为logn。 每次更新的话就是对要更新的点路径上的点重新更加一个,然后进行对没有影响的那些进行连边。然后用一个root记录每一个线段树的根节点下标。 感觉还是不能讲明白,还是看看B站的视频吧。 //#include #include #includ原创 2017-09-14 20:23:16 · 266 阅读 · 0 评论 -
队列极值NOJ1926
题目链接:http://acm.nuc.edu.cn/problem/show/1926 题意:对一个队列进行插入和删除操作,然后会有询问最大值和最小值。 思路:开两个栈A,B,一个用来进一个用来出。然后分别在A,B这边维护最大值和最小值的两个栈。总共开了6个栈数组。 注意为了维护是队列的性质。当B为空的时候A才能吧它的元素放入其中。然后对每次出栈,入栈操作维护一下最大值最小值就行了原创 2017-07-29 10:01:22 · 214 阅读 · 0 评论 -
treap普通平衡树bzoj3224
Treap拥有二叉排序树和heap的共同性质,rnd修正值是节点的一个随机值,使得平衡树为大顶堆,rnd小的为父节点。 当左子节点的rnd小于父节点的时候,需要进行右旋转:父节点作为左节点的右节点,左节点的右节点作为父节点的左节点。 当右子节点的rnd小于父节点的时候,需要进行左旋转:父节点作为右节点的左节点,右节点的左节点作为父节点的右节点。 以下转载自:http://hzwer.原创 2017-07-28 10:32:19 · 236 阅读 · 0 评论 -
poj2823 (双端队列维护固定滑动窗口的最值)
题意:输出每一段为k的最值。 思路:对于查询最小值的话,维护一段上升的的数的下标,当有数进入的时候,将前面比他大的数都删除。然后将前面不在这个窗口的数删除。 现在查询的这个窗口的最小值就是前面的值。用下标的好处是你可以用下标来判断是都在这个区间内。 查询最大值同理。 PS:这个题卡时间卡时间卡的很难受,用c++提交就能过了。 #include #include #incl原创 2017-08-11 10:24:50 · 362 阅读 · 0 评论 -
随机二叉平衡树treap学习
转载自: http://blog.csdn.net/acceptedxukai/article/details/6910685 感觉别人写得特别好。 二叉查找树 二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点转载 2017-07-26 20:57:03 · 306 阅读 · 0 评论 -
Sequence II(hdu5147)树状数组
Sequence II 题意: 在数组中找到符合这个的条件的数的的个数: 1. 1≤abcd≤n 2. AaAb 3. AcAd 思路:对一个在位置i的数,用树状数组就能知道前面比它小的数,类似地,找到后面比他小地数; 根据后面比他小的数这个进行打表记录在这个位置后能够符合的对数; 相乘一下就行了; #include using namespa原创 2016-11-16 21:38:34 · 253 阅读 · 0 评论 -
优先队列学习
转载自:http://www.cnblogs.com/heqinghui/archive/2013/07/30/3225407.html 优先队列:顾名思义,首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队~ 百度百科上这样描述的: 优先级队列 是不同于先进先出队列的另一转载 2016-11-04 19:21:34 · 212 阅读 · 0 评论 -
写过的数据结构实验记录一下
树的应用 (2学时) 1、实验目的 通过本实验掌握二叉的建立和递归遍历、非递归遍历算法,了解二叉树在实际中的应用并熟练运用二叉树解决实际问题。 2、实验内容 根据前序遍历的顺序建立一棵二叉树,并根据遍历规则遍历二叉树。 打印输出。 3、实验要求 (1)根据前序遍历的顺序创建一棵二叉树; ()对二叉树进行前序、中序、后序遍历。 收获:会了非递归进行的三种遍历 //15070642原创 2016-11-30 16:20:30 · 820 阅读 · 0 评论 -
hdu3999二叉排序树
https://vjudge.net/problem/22959/origin 题意及思路: 构建二叉排序树 并输出它的前序遍历; #include #include #include #include #include #include #include using namespace std; typedef long long ll; #define INF 0原创 2017-03-05 14:49:27 · 885 阅读 · 0 评论 -
uva 548 (二叉树)(不知数的多少进行数的一整行输入)
https://vjudge.net/problem/19105/origin 题意:给出一个中序遍历和一个后序遍历,构建树,然后求出从根节点到哪个叶子节点的值最小; 思路: 题并不难,主要是不知道数的数目进行数的一整行输入; 实现数的一整行输入: 代码可以写成: int ReadLine(T* data_array) { string str_line; i原创 2017-03-05 15:53:25 · 287 阅读 · 0 评论 -
二叉树的遍历学习
对于一棵树: 树的遍历分为: 1.层序遍历: 一层一层的遍历i,相当于BFS:遍历顺序FCEADHGBM 在树已经构建出来的情况下,利用BFS输出层次遍历 2.前序遍历:先访问根节点,然后左子树,然后右子树,相当于DFS:FCADBEHGM 在树已经构建出来的情况下,输出代码如下: void Print(int root) { if(root == 0) re原创 2016-09-03 19:23:33 · 475 阅读 · 0 评论 -
bzoj 2038 (莫队入门)
先预处理一下C(i,2),然后增区间的时候只需要执行减加操作。 #include using namespace std; #define clr(x,y) memset(x,y,sizeof x) typedef long long ll; typedef unsigned long long ull; const int maxn = 2e5 + 10; int a[maxn],n原创 2017-11-01 17:07:53 · 267 阅读 · 0 评论