![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM-数据结构
文章平均质量分 64
Helios_nannan
得失成败,都只对自己交代
展开
-
csu 1555 Inversion Sequence 线段树反求逆序数
传送门:Inversion Sequence题目大意告诉逆序数,求出原逆序数解题思路我们可以先看样例怎么推倒出来的: 1 2 0 1 0 1. 在1前面有1个比这个数大的,所以1只能在第二个位置 2. 在2前面有两个比他大的数,其中1又排在了第二个位置,所以2只能排在第四个位置 3. 在3前面有0个比3大的,所以3只能排在第一个位置 4. 在4前面有一个比4大的,所以4只能在最后一个位置原创 2016-07-27 00:53:39 · 356 阅读 · 0 评论 -
打印二叉树的边界节点 c++实现
给定一颗二叉树的头结点,按照下面的规则实现二叉树的边界节点的逆时针打印。头结点的边界节点叶子节点为边界节点如果节点在所在层的最左边或者最右边,那么也是边界节点比如下图这棵树: 程序流程1.得到二叉树上每一层最左和最右的节点,用上图的例子来说,这个记录过程如下: - 最左节点 最右节点 第一层 1 1 第二层 2 2 第三层 4 6 第四层原创 2016-10-16 20:09:31 · 1635 阅读 · 0 评论 -
二叉树的递归和非递归方式的三种遍历
二叉树的三种遍历方式,前序遍历,中序遍历,后序遍历,中的前中后都是指的是根节点的访问顺序,这三种遍历方式的概念在这里就不多说了,太普遍了!二叉树的建立我们这里以前序遍历为例: 我们先定义好结构体struct Tree{ Tree* lson; Tree* rson; int data;};Tree* T;下面是前序建立二叉树:void c原创 2016-10-16 13:18:57 · 12744 阅读 · 6 评论 -
归并排序及其应用 c++实现
归并排序是基于分治的思想,分治策略:将原问题划分为n个规模较小的并且结构与原问题相似的子问题,递归的解决这些子问题,然后合并其结果,得到的就是原问题的解了。 分治的模式在每一层的递归上都有三个步骤: 1、 分解:将原问题分解为一系列的子问题 2、 解决: 递归的解决各个子问题。若子问题足够的小,则直接求解。 3、 合并:将子问题的结果合并,变为原问题的解。归并算法完全依照于分治的策略: 1原创 2016-10-13 18:51:20 · 767 阅读 · 2 评论 -
hanoi塔问题解析(二)
在上一篇文章中解释了一下hanoi塔的基本过程和以及路径的打印! 在这片文章中我们主要的说一下当前运行到得状态时第几个最佳状态! 在解决上面的问题之间我们还要解决的就是hanoi塔移动的最小步数hanoi塔移动的最小步数我们之后hanoi塔移动的三个步骤: 1. 将A柱子上面的三个移动到B柱子上面(借助C柱子) 2. 将A柱子上面中最下面的圆盘移动到C柱子上面 3. 将B柱子上面的所有原创 2016-10-14 20:17:07 · 2041 阅读 · 1 评论 -
hanoi塔问题解析(一) c++实现
什么是hanoi塔? 汉诺塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。如下图 问题解答 问题定义 我们把左边的柱子叫做A,中间的柱子叫做B,右边的柱子叫做Chanoi塔的搬运过程; i原创 2016-10-14 19:10:39 · 28244 阅读 · 5 评论 -
hdu 5548 sort 2016青岛区域赛网络赛 二分+队列优化
传送门:hdu 5548 sort这个题目的标准复杂度是o(n*lgn),据说如果多乘一个lgn优化一个输入还是可以过得!也就是使用优先队列的做法! 这个题目还有一个坑点就是不能每次只是贪心,就比如说枚举到k=4的时候1,2,3,4,5这个数列的最小值是先把前两个合并变为数列3,3,4,5然后在进行合并才是最少的花费,这样的花费是3+15=18,然而如果按照贪心的思路去做,第一次先枚举前四个那么第原创 2016-09-17 22:57:13 · 564 阅读 · 0 评论 -
poj 2559 Largest Rectangle in a Histogram 求面积最大的矩形(单调栈)
Largest Rectangle in a Histogram题目大意给出一个数N代表有多少个矩形,然后下面有N个数代表每个矩形的高度,宽度均为1。最后求这N个矩形组成的最大面积!解题思路很容易想到的就是使用单调栈。维护一个从栈顶到栈低减小的栈! 每次遇到栈顶的元素大于要压入的元素就要,出栈然后和当前的最大面积取最大值,这样一直下去,最后栈中就剩下一个从栈顶到栈低减小的栈。最后变为的栈就像下面这原创 2016-08-31 00:05:03 · 3106 阅读 · 0 评论 -
hdu 1305 Immediate Decodability 简单字典树
传送门:hdu 1305 Immediate Decodability题目大意查询一个单词是不是另一个单词的前缀。解题思路简单地字典树题目!!AC代码#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<iostream>using namespace std;#define lson l,原创 2016-07-21 23:06:06 · 514 阅读 · 0 评论 -
hdu 5592 ZYB's Premutation 经典线段树
传送门:hdu 5592 ZYB’s Premutation 题目大意给出N个数,第i个表示前i个有多少个逆序数,求出原序列解题思路非常经典的线段树求关于逆序数类的题目! 如果某个位置没有使用过,我们就设这个位置为1,如果这个位置已经被使用过了就置为0。我们用线段树维护当前区间有多少个1。 A[i+1]-A[i]是相对于A[i]位置的新增的逆序数,x=A[i+1]-A[i]+1表示还没操作的中第原创 2016-08-16 19:06:14 · 344 阅读 · 0 评论 -
poj 3667 Hotel 经典线段树区间合并
传送门:poj 3667 Hotel题目大意题意: 1 a:询问是不是有连续长度为 a 的空房间,有的话住进最左边 2 a b:将[a,a+b-1]的房间清空解题思路当我们读懂这个题目的时候,我们一般会考虑下面几个问题 1. 怎么解决空房间不连续的问题 2. 怎么快速找到查询时候的下标 3. 父节点保存的什么,也就是pushUp应该怎么写? 下面我们来一步步的解决上面的疑问? 第三个原创 2016-07-21 03:54:22 · 274 阅读 · 0 评论 -
hdu 1251 统计难题 字典树
传送门:hdu1251统计难题 中文题目不做过多的解释解题思路已经接近于字典树的模板题目,每次把字典中的单词加入到树里面。 先是要创建这棵树, 1. 线定义结构体,先看我们定义的结构体typedef struct Trie{ int v; Trie *next[26];}Trie;创建字典树函数,字典树的创建如下图:, 这个图对应的过程就是, 首先是一个根节点,他是所有原创 2016-07-20 23:40:29 · 373 阅读 · 0 评论 -
poj3468 A Simple Problem with Integers 线段树区间更新,区间求和
传送门:poj3468 A Simple Problem with Integers题目大意输入:第一行输入两个数N和Q。N代表有多少个元素,Q代表进行多少次操作 第二行数输入n个数 表示对应的初始值 然后下面的Q行代表操作: C a b c把a到b区间的数增加c Q a b输出a到b区间的数量之和 输出:每当有Q操作输出a到b区间的数量之和解题思路如果总是WA的话,可以测试这个数据:10原创 2016-07-09 10:11:25 · 476 阅读 · 0 评论 -
hdu 1394 Minimum Inversion Number(最小逆序数) 线段树/暴力
传送门:hdu 1394 Minimum Inversion Number题目大意给定n个数,求这个数组最小逆序数。 可能有很多人对逆序数不太了解,在这里科普一下:对于n个元素来讲,他们之间遵循一个标准次序(比如说从小到大排列下去),于是在这个n个元素的任意排列中,当某两个元素不符合这个标准次序的时候,就说这事一个逆序。一个排列中的所有所有逆序之和叫做这个排列的逆序数。这个题目当中,元素的标准次序原创 2016-07-08 22:35:27 · 387 阅读 · 0 评论 -
poj2777 Count Color 线段树区间更新+位操作
传送门:poj2777 Count Color题目大意有一个长为L的甲板,能把他平均分为L段,每一段能有不同的颜色,为了简便,颜色可以数字(1,2,…T)代表不同的颜色。初始的时候L段均为颜色1。我们能对这个分为L段的甲板做两种操作: 1. C X Y Z,C代表操作 把区间[X,Y]中所有段变为Z颜色 2. P X Y ,P代表操作,表示查询出[X,Y]中有几种不同的颜色输入:第一行输入原创 2016-07-07 18:12:27 · 295 阅读 · 0 评论 -
hdu1698 Just a Hook 线段树区间更新,延时标记
传送门:hdu1698 Just a Hook 题目大意有三种钩子,分为铜,银,金,对应的价值分别为1,2,3,一共有n个钩子,初始的时候每个钩子的都是铜的。先做如下操作对x到y区间的钩子改变为z价值(1~3)的,最后求出所有钩子的总价值。 输入:第一行输入t组测试数据 然后测试数据的第一行表示表示有多少个钩子 下面一行输入一个整数q表示有多少种操作 下面的q行是每一次操作是,x,y,z,表原创 2016-07-07 12:46:26 · 381 阅读 · 0 评论 -
hdu1166 敌兵布阵 线段树单点更新+区间求和
传送门:hdu1166 敌兵布阵 这个是个中文题目,所以肯定题目的理解不是问题。解题思路最基本的线段树,在新增或者删除的时候使用更新函数updataTree()来增加营内的数量,查询的时候使用queryTree查询出营区间的的认识总和。总而言之是水题。线段树入门题AC代码#include<cstdio>#include<cstring>#include<set>#include<stack原创 2016-07-06 21:51:25 · 358 阅读 · 0 评论 -
神级遍历二叉树的方法(Morris算法)上
在前面的文章中我们介绍了关于二叉树的三种遍历方式的递归和非递归的形式!时间复杂度为O(n)O(n),空间复杂度也为O(h)O(h)(h为树的高度),对于每个节点我们都要访问一遍,所以时间复杂度是没有办法优化了, 但是想一下,我们为什么要申请额外的数据结构,这是因为二叉树这种结构,在处理完一个节点是时候很容易做到访问下层,但是很难做到访问上层,我们申请额外的数据结构就是为了保存当前节点的父节点! 下面原创 2016-10-17 18:18:49 · 7247 阅读 · 1 评论