BZOJ 1078 斜堆】的更多相关文章

感谢MATO大神的博客 http://www.cppblog.com/MatoNo1/archive/2013/03/03/192131.html 注意细节. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 150 using namespace std; ; int find() { int now=root; while (ls[…
1078: [SCOI2008]斜堆 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 770  Solved: 422[Submit][Status][Discuss] Description 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小.但斜堆不必是平衡的,每个结点的左右儿子的大小关系也没有任何规定.在本题中,斜堆中各个元素的值均不相同. 在斜…
1078: [SCOI2008]斜堆 Description 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小.但斜堆不必是平衡的,每个结点的左右儿子的大小关系也没有任何规定.在本题中,斜堆中各个元素的值均不相同. 在斜堆H中插入新元素X的过程是递归进行的:当H为空或者X小于H的根结点时X变为新的树根,而原来的树根(如果有的话)变为X的左儿子.当X大于H的根结点时,H根结点的两棵子树交换,而X(递…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1078 考察斜堆的性质: 一个点如果没有左子树,也一定没有右子树: 看了这篇精美的博客:http://www.cppblog.com/MatoNo1/archive/2013/03/03/192131.html 对斜堆有了更多认识. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #includ…
题意:主席树做法见上一题 我曾发过誓再也不写左偏树(期末考试前一天下午5个小时没写出棘手的操作) 于是我来写斜堆啦 从叶子往根合并,维护斜堆就行了 题目连拓扑序都给你了... 说一下斜堆的操作: 合并:无脑交换一次左右子树 删除:合并左右子树代替自己 然后每个点保存一个根 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cma…
2016-05-31 16:34:09 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1078 挖掘斜堆的性质233 http://www.cppblog.com/MatoNo1/archive/2013/03/03/192131.html 首先它不如左偏树稳定,是均摊logn,而左偏树是严格的 最后加入的点有两个性质 1.一定是极左的点 2.它没有右子树,要么是叶子节点,要么原树的某一部分子树变为它的左儿子. 可以得出结论每一个非叶节点都…
[BZOJ1078][SCOI2008]斜堆(性质题) 题面 BZOJ 洛谷 题解 考虑一下这道题目的性质吧.思考一下最后插入进来的数是什么样子的.首先因为它是最后插入进来的,所以一定是比某个数小,然后把这个数作为一个根,原来的树根直接接到了左儿子上面,因此它没有右儿子.然而显然可以同时有多个儿子没有右子树.再想想,显然的,每次都是交换路径上的左右儿子,然后插入到左儿子中,所以显然最后插入的这个点是一路插进左儿子的.所以每次找到最靠左的.并且没有右儿子的位置,然后再判断一下它的左儿子是否只有一个…
http://www.lydsy.com/JudgeOnline/problem.php?id=1078 (题目链接) 题意 给出一个斜堆,并给出其插入的操作,求一个字典序最小的插入顺序. Solution YY了很久,画出样例,你会发现很神奇的性质:一般情况下,因为是一个一个插入节点的,左子树与右子树的大小要么相等要么左子树比右子树大1. 然而,我忽略了一条链的情况,写写画画搞来搞去,最后分类讨论了一下.关键的地方是要想到我们对于一棵子树,在前提条件相同的情况下,应尽肯能的早插入根,因为是个小…
题意: 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小.但斜堆不必是平衡的,每个结点的左右儿子的大小关系也没有任何规定.在本题中,斜堆中各个元素的值均不相同. 在斜堆H中插入新元素X的过程是递归进行的:当H为空或者X小于H的根结点时X变为新的树根,而原来的树根(如果有的话)变为X的左儿子.当X大于H的根结点时,H根结点的两棵子树交换,而X(递归)插入到交换后的左子树中. 给出一棵斜堆,包含值为0…
概要 本章介绍斜堆.和以往一样,本文会先对斜堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若文章有错误或不足的地方,请不吝指出! 目录1. 斜堆的介绍2. 斜堆的基本操作3. 斜堆的C实现(完整源码)4. 斜堆的C测试程序 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3638493.html 更多内容:数据结构与算法系列 目录 斜堆的介绍 斜堆…
概要 上一章介绍了斜堆的基本概念,并通过C语言实现了斜堆.本章是斜堆的C++实现. 目录1. 斜堆的介绍2. 斜堆的基本操作3. 斜堆的C++实现(完整源码)4. 斜堆的C++测试程序 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3638524.html 更多内容:数据结构与算法系列 目录 斜堆的介绍 斜堆(Skew heap)也叫自适应堆(self-adjusting heap),它是左倾堆的一个变种.和左倾堆一样,它通常也用于实现优先队列:作为…
概要 前面分别通过C和C++实现了斜堆,本章给出斜堆的Java版本.还是那句老话,三种实现的原理一样,择其一了解即可. 目录1. 斜堆的介绍2. 斜堆的基本操作3. 斜堆的Java实现(完整源码)4. 斜堆的Java测试程序 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3638552.html 更多内容:数据结构与算法系列 目录 斜堆的介绍 斜堆(Skew heap)也叫自适应堆(self-adjusting heap),它是左倾堆的一个变种.和左…
一.斜堆 斜堆是一种可以合并的堆 节点信息: struct Node { int v; Node *ch[]; }; 主要利用merge函数 Node *merge(Node *x, Node *y) { if(!x) return y; if(!y) return x; if(x->v < y->v) swap(x, y); x->ch[] = merge(x->ch[], y); ], x->ch[]), x; } 左偏树需要维护一个额外的信息,而斜堆每次强制swa…
题目大意 1.题目描述 斜堆(skew heap)是一种常用的数据结构. 它也是二叉树,且满足与二叉堆相同的堆性质: 每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小. . 但斜堆不必是平衡的,每个结点的左右儿子的大小关系也没有任何规定. 在本题中,斜堆中各个元素的值均不相同. . 在斜堆\(H\)中插入新元素\(X\) 的过程是递归进行的: (1)当\(H\)为空或者\(X\)小于\(H\)的根结点时, \(X\)变为新的树根,而原来的树根(如果有的话)变为\(X\)的左儿子. .…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1078 题意概括 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小.但斜堆不必是平衡的,每个结点的左右儿子的大小关系也没有任何规定.在本题中,斜堆中各个元素的值均不相同. 在斜堆H中插入新元素X的过程是递归进行的:当H为空或者X小于H的根结点时X变为新的树根,而原来的树根(如果有的话)变为X的左儿子…
思路 可并堆真是一种神奇的东西 不得不说这道题是道好题,虽然并不需要可并堆,但是能加深对可并堆的理解 首先考虑斜堆的性质,斜堆和左偏树相似,有如下的性质 一个节点如果有右子树,就一定有左子树 最后插入的节点一定没有右子树 然后考虑倒序删除节点就可以做了 对一个节点,如果它没有右子树,它就可能是最后插入的点,但是显然还有其他情况 如果它的左子树中还有满足条件的点,则取深度最浅的节点即可,考虑小于等 于当前根的权值的情况时,取深度最深会有问题,可以自行画图 然后如果左子树中只有一个节点,那么两个节点…
实现优先队列结构主要是通过堆完成,主要有:二叉堆.d堆.左式堆.斜堆.二项堆.斐波那契堆.pairing 堆等. 1. 二叉堆 1.1. 定义 完全二叉树,根最小. 存储时使用层序. 1.2. 操作 (1). insert(上滤) 插入末尾 26,不断向上比较,大于26则交换位置,小于则停止. (2). deleteMin(下滤) 提取末尾元素,放在堆顶,不断下滤: (3). 其他操作: 都是基于insert(上滤)与deleteMin(下滤)的操作. 减小元素:减小节点的值,上滤调整堆. 增大…
题目背景 四川2008NOI省选 题目描述 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相 同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小. 但斜堆不必是平衡的,每个结点的左右儿子的大小关系也没有任何规定.在本题 中,斜堆中各个元素的值均不相同. 在斜堆 H 中插入新元素X 的过程是递归进行的:当H 为空或者X 小于H 的根结点时X 变为新的树根,而原来的树根(如果有的话)变为X 的左儿子. 当X 大于H 的根结点时,H 根结点的两棵子树交…
Description 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小.但斜堆不必是平衡的,每个结点的左右儿子的大小关系也没有任何规定.在本题中,斜堆中各个元素的值均不相同. 在斜堆H中插入新元素X的过程是递归进行的:当H为空或者X小于H的根结点时X变为新的树根,而原来的树根(如果有的话)变为X的左儿子.当X大于H的根结点时,H根结点的两棵子树交换,而X(递归)插入到交换后的左子树中. 给出一棵…
http://hzwer.com/5790.html  代码 http://www.cppblog.com/MatoNo1/archive/2013/03/03/192131.html  //原理讲解 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值 都比它父亲大.因此在整棵斜堆中,根的值最小.但斜堆不必是平衡的,每个结点的左右儿子的大小关系也没有任 何规定.在本题中,斜堆中各个元素的值均不相同. 在斜堆H中插入新元素X的过程是递归进行的…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2809 [题目大意] 给出一棵树,求出每个点有个权值,和一个乘算值,请选取一棵子树, 并在这个子树上选择一些节点,使得根节点的乘算值乘上选取的节点数价值最大, 并且权值和不超过给定的限制 [题解] 我们在树上做dfs,计算每个点作为子树根节点时候的价值, 维护可并的权值大根堆,自下而上合并,当发现权值和大于限制的时候pop根节点即可. [代码] #include <cstdio> #…
1109: [POI2007]堆积木Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 948  Solved: 341[Submit][Status][Discuss] Description Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体.每个积木上面都有一个数.Mary用他的所有积木垒了一个高塔.妈妈告诉Mary游戏的目的是建一个塔,使得最多的积木在正确的位置.一个上面写有数i的积木的正确位置是这个塔从下往上数第i个位置…
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1078 每一次进入的点一定是一个极左节点,然后将它所处在的整棵树左右翻转.加上一些情况的处理. #include<cstring> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstdio> #include<cmath> #include<…
BZOJ 二维\(DP\)显然.尝试换成一维,令\(f[i]\)表示,强制把\(i\)放到\(a_i\)位置去,现在能匹配的最多数目. 那么\(f[i]=\max\{f[j]\}+1\),其中\(j<i,\ a_j<a_i,\ j-a_j\leq i-a_i\).就是三维偏序,可以\(CDQ\). 这三个不等式很相似,再观察一下,发现由\(a_i>a_j,\ i-a_i\geq j-a_j\)就可以推出\(i>j\). 所以只要满足两个条件就可以了,即二维偏序. 同时转移比较特殊,…
用堆模拟题目中的操作即可. # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector> # include <queue> # include <stack> # include <map> # include <set> # include <cmath&…
先把每个长为$mina$,宽为$minb$的矩阵扔到堆里,然后由于矩阵中的数都是正的,所以我们每取出来一个矩形,,就把他向四个方向扩张一行,再把这新的且更大的四个矩形扔到堆里.注意判重,于是我比较懒用的$map$ $qwq$ #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<cctype>…
$ BZOJ~1233~~ $ 干草堆: (题目特殊性质) $ solution: $ 很妙的一道题目,开始看了一眼觉得是个傻逼贪心,从后往前当前层能多短就多短,尽量节省花费.但是这是DP专题,怎么会有一道小贪心混进来?上网一搜,我果然还是太笨了! 6 11 10 7 3 2 6 这组小数据直接把贪心逼上绝路,如果顶层只有6(6-237-1011),只有三层.而如果顶层宽一点(62-37-10-11),就有四层了.什么!我之前好心节省草包,居然办了坏事? 好吧,题目限定了每一个草包都必须用,这样…
[题意] n个数的序列,删除一个数后序列左移,求最后满足i==a[i]的最大个数. [思路] 设最终得到a[i]==i的序列为s,则s应满足: i<j,a[i]<a[j],i-a[i]<=j-a[j] 最后一项代表后边的移动距离不少于前边的. 因为i=i-a[i]+a[i] 所以只要满足i-a[i]单调不减,a[i]单调递增则i一定递增. 则问题转化为一个二维偏序问题,O(nlogn)求LIS.用个BIT即可. [代码] #include<cstdio> #include&l…
题目大意:给定一个序列,能够多次将某个位置的数删掉并将后面全部数向左串一位,要求操作后a[i]=i的数最多 首先我们如果最后a[i]=i的数的序列为S 那么S满足随着i递增,a[i]递增(相对位置不变),i-a[i]单调不减(后面的不会比前面移动的少) 这是一个三维偏序问题 要是不看题解我就真去写CDQ分治了233 我们发现i=(i-a[i])+a[i] 也就是说假设一个序列满足i-a[i]单调不减且a[i]单调递增 那么i一定单调递增 于是就剩两维偏序了 LIS走起吧= = #include…
Description 题库链接 给定一棵 \(n\) 个节点的有根树,每个点有一个权值 \(val_i\) .你需要选择尽可能多的节点,使得:对于任意两个点 \(i,j\) ,如果 \(i\) 在树上是 \(j\) 的祖先,那么 \(v_i>v_j\) .请计算可选的最多的点数,注意这些点不必形成这棵树的一个连通子树. \(1\leq n\leq 200000\) Solution 记 \(f_{u,i}\) 表示在 \(u\) 节点的子树中选取的最大的点权为 \(i\) 的方案最大值. 那么…