
数据结构
Layne...
遇事不决,可问春风
展开
-
求逆序对(归并排序 / 树状数组)
逆序对: 对于给定的一段正整数序列,逆序对就是序列中 ai > aj 且 i < j 的有序对。(逆序数的求法至少有三种:枚举法、分治法、树状数组。下面说说分治法。。。)树状数组的做法以及离散化等内容见洛谷题解:P1908 逆序对 题解归并排序解法(分治法):归并排序(merge sort)是建立在归并操作上的一种有效的排序算法。 该算法是采用分治法(Divide and C...原创 2019-03-23 19:37:03 · 615 阅读 · 0 评论 -
树状数组模板
对于一个普通数组,时间复杂度为单点修改O(1),区间求和O(n);可对其预处理前缀和,则时间复杂度为区间求和O(1),但单点修改变为O(n)。已知一个算法的时间复杂度取决于最大的那一步,所以为了均衡,便可用树状数组【时间复杂度O( log(n) )】处理该问题。下面是树状数组的几个模板:①单点修改,区间查询。#include<bits/stdc++.h>using nam...原创 2020-03-19 21:09:59 · 306 阅读 · 0 评论 -
二叉查找树
二叉查找树(二叉搜索树): ——摘自《挑战》输入若干条命令,执行以下操作:insert x——将x插入到二叉排序查找树中delete x——从二叉排序查找树中删除xfind x——从二叉排序查找树中查找x,找到则输出yes,否则输出nomin——输出该二叉排序查找树的最小值traverse...原创 2019-08-10 12:01:00 · 172 阅读 · 0 评论 -
二叉树重建
一棵二叉树:树的先序遍历序列preorder:DBACEGF(根左右)树的中序遍历序列inorder:ABCDEFG(左根右)树的后序遍历序列postorder:ACBFGED(左右根)树的层序遍历序列levelorder:DBEACGF(按行遍历)输入一棵二叉树的先序遍历和中序遍历序列,输出它的后序遍历序列。 输入:DBACEGF ABCDEF...原创 2019-08-09 16:37:00 · 151 阅读 · 0 评论 -
2019牛客多校训练第四场C.sequence(线段树+单调栈+前缀和)
题目传送门题意输入整数n,给出两个包含n个整数的序列a和b,找到一个区间[l,r],使在该区间内a序列最小值×b序列区间和的值最大。题解遍历a序列,维护单调栈求以当前值a[i]为最小值时的最大可达区间[ L[i],R[i] ](即最大左右边界);b序列先预处理其前缀和pre_sum,后用线段树维护pre_sum数组的区间最值;所以答案就是a[i]×b序列在[ L[i]...原创 2019-08-26 19:12:00 · 292 阅读 · 0 评论 -
单调栈
单调栈:单调栈解决的是:以某个值为最小(最大)值的最大区间。实现方法:求最小值(最大值)的最大区间,维护一个递减(递增)的栈。(下面以求最小值最大区间为例)当遇到一个比栈顶小的值的时候开始弹栈,弹栈停止的位置到这个值的区间即为此值左边的最大区间;同时,当一个值被弹掉的时候也就意味着比它更小的值来了,也可以计算被弹掉的值的右边的最大区间。单调递增:数据出栈的序...原创 2019-08-14 21:29:00 · 173 阅读 · 0 评论 -
2019牛客多校训练第八场A.All-one Matrices(前缀和+单调栈)
题目传送门题意:输入n和m,给出一个n行m列的01矩阵,求出所有的不可扩大的全1矩阵个数。题解:预处理每个格子的高度up[i][j](其向上连续的1的个数),枚举每一行 i,维护单调栈(单调上升)求每个格子 j 以up[i][j]为高可达到的全1矩阵左边界pos和右边界j,此时得到的全1矩阵不能再向上左右拓展,只要判断能否再向下拓展即可。只要下一行[pos,j]区...原创 2019-08-15 00:11:00 · 182 阅读 · 0 评论 -
2019牛客多校训练第二场H. Second Large Rectangle (单调栈 / 悬线法)
题目传送门题意输入整数n和m(n和m均∈[1,1000]),给出一个n×m的01矩阵,求第二大全1矩阵的面积。(如果矩阵少于两个1,则输出0)题解①单调栈做法【复杂度O(n×m)】:先预处理每个点(i,j)的高up[i][j],枚举每一行作为底边,遍历每一个点j,维护单调递减栈计算当前高度可达的最大区间(即当前可形成的全1矩阵的最大宽),宽×高即得当前可形成的全1矩形...原创 2019-08-15 00:09:00 · 173 阅读 · 0 评论 -
实验一:顺序表、单链表
单链表的一些操作:①初始化建立链表②输入③查找取值④插入⑤删除⑥遍历输出#include<bits/stdc++.h>#define ENDL puts("")using namespace std;typedef struct LNode{ int data; struct LNode *next;}LNode,*LinkList;void...原创 2019-09-28 10:20:42 · 330 阅读 · 0 评论 -
实验二:栈和队列
顺序栈,链栈,顺序队列(循环队列),链队分别实现初始化,入栈(队),出栈(队) 三个操作#include<bits/stdc++.h>#define MAXSIZE 5using namespace std;typedef struct node1{ int Maxsize; int head,tail,*cnt; ///顺序队列,*cnt为内空间基地址 ...原创 2019-10-16 16:58:34 · 271 阅读 · 0 评论 -
实验三:二叉树基本操作的实现
#include<iostream>using namespace std;typedef struct BITNode{ char data; struct BITNode *lchild,*rchild;}BITNode,*BITree;void Creat(BITNode* &T){ ///以先序遍历的顺序建立二叉树 char ch;cin...原创 2019-11-24 16:53:19 · 756 阅读 · 0 评论 -
实验五:查找
#include<bits/stdc++.h>#define MAXN 100using namespace std;typedef struct{///顺序表 int *R,len;}SSTable;typedef struct BSTNode{///二叉链表 int data; struct BSTNode *lchild,*rchild;}BS...原创 2019-12-05 22:41:54 · 429 阅读 · 0 评论 -
数据结构实验课题:基于哈夫曼树的数据压缩算法
#include<bits/stdc++.h>#define Line cout<<"------------------------------------------\n"#define MAX 1000using namespace std;typedef struct{ int weight; int parent,lchild,rchild...原创 2020-01-12 17:11:38 · 2583 阅读 · 0 评论 -
并查集(模板题)
并查集并查集是一种树形的数据结构,用于处理一些不相交集合的合并及查询问题。初始化void init(int n){ for(int i=0;i<=n;i++) f[i]=i;//初始化,使所有数的父亲节点都等于TA本身,即是所有数都为毫不相干的根节点}查找根节点(即找祖先int find_f(int x){ if(f[x]==x)return...原创 2019-07-09 00:09:39 · 808 阅读 · 0 评论 -
数据结构实验课题:基于Dijsktra算法的最短路径求解
#include<bits/stdc++.h>#define MAXINT 0x3f3f3f3f#define Line cout<<"-----------------------------------------\n"using namespace std;typedef struct{ int n,m;//城市数,路径数 int **data...原创 2020-01-12 17:10:08 · 979 阅读 · 0 评论 -
链表(C和Java代码实现)
题目:逆序输出,当输入-1时表示输入结束。1. 使用不带头结点的头插入法创建链表每创建一个结点,都使该结点成为头结点,这样头结点不断地向前移动,就可以创建一个没有特定头结点的链表。首先创建的结点,会出现在整个链表的最末端,所以数据的写入是逆序的。【注意:开始的时候,head要初始化为NULL】#include&amp;lt;stdio.h&amp;gt;#include&amp;lt;stdlib.h&amp;gt;...原创 2019-05-01 15:12:28 · 175 阅读 · 0 评论 -
树状数组
掌握树状数组~彻底入门 先贴一下树状数组的模板代码: 1 int lowbit(int i) 2 { 3 return i &amp;amp;amp; -i;//或者是return i-(i&amp;amp;amp;(i-1));表示求数组下标二进制的非0最低位所表示的值 4 } 5 void update(int i,int val)//单点更新 6 { 7 ...转载 2019-03-04 09:36:45 · 161 阅读 · 0 评论 -
字符串匹配——KMP算法(模板)
KMP算法的原理具体请看以下博客:从头到尾彻底理解KMP(2014年8月22日版)(其中有关于BM算法和Sunday算法的介绍)KMP算法最浅显理解——一看就明白转自知乎-我见过最通俗易懂的KMP算法详解kmp算法介绍KMP模版 && KMP求子串在主串出现的次数模版next数组的求法:先将next数组初始化为0,将子串和自己进行匹配,第一个不进行匹配(next[0]...原创 2019-03-26 15:10:33 · 423 阅读 · 0 评论 -
单调栈、单调队列
单调队列与单调栈作用:以下内容引用自该博客:单调队列与单调栈作用单调栈解决的是以某个值为最小(最大)值的最大区间,实现方法是:求最小值(最大值)的最大区间,维护一个递增(递减)的栈,当遇到一个比栈顶小的值的时候开始弹栈,弹栈停止的位置到这个值的区间即为此值左边的最大区间;同时,当一个值被弹掉的时候也就意味着比它更小(更大)的值来了,也可以计算被弹掉的值得右边的最大区间。下面给出单调栈的类型...原创 2019-05-01 15:00:32 · 307 阅读 · 0 评论 -
RMQ(区间最值查询问题)
RMQ学习总结(附带简单例题)RMQ (Range Minimum/Maximum Query)算法模板:找出区间内的最大值:#include<bits/stdc++.h>using namespace std;int a[10002],f[10002][18],n;void RMQ_prepare(){ for(int i=1;i<=n;i++) ...原创 2019-03-28 23:55:45 · 184 阅读 · 0 评论