
数据结构与算法基于c++实现
文章平均质量分 60
MatrixYg
暂无
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【Removing Stones 】
1.牛客多校的题目,大意就是:找出有多少个区间满足:区间最大值的两倍小于等于区间和。统计这样的区间数并输出答案。2.我们可以枚举最大值,对于每个a[i],他都可以作为某些区间的最大值,可以找出这段区间最左边的端点和最右边的端点。然后枚举一个二分另外一个即可。至于怎么枚举最值,可以分治,分治的时候会出现一些比较强的数据,让你的分治失效,如果你每次都是默认的枚举左端点二分右端点,那么可能区间不是很...原创 2019-07-27 18:58:27 · 264 阅读 · 0 评论 -
【HDU 4578】Transformation
1.题目链接。题意其实还是比较简单的,大概就是一些线段树区间修改的操作集合起来吧。2.每个节点维护八个信息:区间[l,r].然后是三个区间和,区间元素和,区间元素平方和,区间元素立方和。然后是三个lazy标记,lazy1:区间元素的增量,lazy2:区间元素乘的数值,lazy3:区间元素改变的数值.然后就是区间修改区间查询的操作了。代码写起来很复杂,理解难度很小。#include<...原创 2019-05-07 15:22:44 · 226 阅读 · 0 评论 -
【HDU 4027】线段树维护区间和
1.题目链接。题意简洁,就是两种操作,区间整体开方,区间求和。类似于区间修改操作但是我们没必要再加上懒惰标记,因为开方开多了这个点就会变成1,所以其实连续对区间操作,没有几次就不用进行修改了,我们特判一下区间都是1的情况,这样就直接修改不加懒惰标记也是可以的。#include<bits/stdc++.h>#include<stdio.h>#include<i...原创 2019-04-30 22:34:57 · 362 阅读 · 0 评论 -
【HDU 1542】矩形的面积并求解
1.题目链接。其实是一个比较经典的问题,自己对着代码手动的画一下就明白了。主要是弄清楚线段树维护的到底是个什么东西,在扫描线向上扫描的过程中,线段树维护了当前x轴上有贡献的线段长度。具体的思路是首先离散化每个点,然后在这些点上打标记,记录每个点的贡献,算出当前线段的长度即可。#include<bits/stdc++.h>#include <algorithm>#d...原创 2019-04-30 16:53:31 · 152 阅读 · 0 评论 -
【HDU 6483】A Sequence Game
1.题目链接。题目大意,给你一个数组,然后m组询问,每组询问[l,r],如果这个区间元素是连续的,那么就输出Yes,否则NO。2.这个题目的写法还是蛮多的,主席树在线处理/树状数组+RMQ+离线+离散化数据。我采用的是第二种写法。其实树状数组维护的就是这个询问的区间的种类数,然后RMQ维护的是区间的最大值和最小值。如果区间的种类数等于最值之差,那么就是区间一定就是连续了,否则不连续。然后数据是...原创 2019-05-05 21:17:10 · 328 阅读 · 0 评论 -
【POJ 3264】线段树维护区间最值
1.题目链接。题意就是给你一个序列,完后Q组询问 ,每次询问(l,r)区间内最大值和最小值之差。RMQ其实可以很简单的解决,不过最近在复习线段树,就用线段树写一下。#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;...原创 2019-04-29 17:29:21 · 797 阅读 · 0 评论 -
【HDU 2888】RMQ
1.题目链接。题目大意,给定一个矩阵,然后Q组询问,询问是(x,y,x1,y1).问以这两个点组成的子矩阵里面的最大值是不是在四个角上。2.RMQ寻找最大值,然后判断一下是不是在角上即可。但是注意一下这里的内存已经是很有限了,所以需要严格的注意数组大小很容易MLE。#include<iostream>#include <string.h>#include &l...原创 2019-04-29 16:16:51 · 264 阅读 · 0 评论 -
【POJ 2352】树状数组
1.题目链接。题目大意:给定n个点,对每一个点,求一下这个点左下方有多少个点。(左下方的定义就是:横纵坐标同时小于等于这个点的坐标)。2.分析:由于题目比较良心,输入的时候y就是有序的,所以其实我们只需要统计一下横坐标小于等于这个点的数的数量即可。那么就比较简单了,我们对x轴建一颗树状数组,初始化为0,每次输入一个数据,把这个数据插入到树状数组里面,注意这里的插入其实是逻辑上的插入,也就是不是...原创 2019-04-24 20:51:18 · 251 阅读 · 0 评论 -
【LUOGU 1972】HH的项链
1.题目链接。给定一个数组,然后m个询问,每组询问[l,r]输出[l,r]这个区间有多少种元素。2.这个题目的写法很多,可以莫队,可以树状数组/线段树,也可以直接在线主席树。在这里面感觉离线后树状数组是最好写的(当然,主席树我也写不好)。首先是需要离线所有的询问,然后按照区间的右端点排序,然后对于每一个询问tree[j]存的是[1,j]里面所有元素的的种类,然后对于每一组询问,我们从l,遍历到...原创 2019-05-04 23:47:54 · 255 阅读 · 0 评论 -
【POJ 2019]二维RMQ
1.题目链接。题目大意,给定一个矩阵,k组询问,每组询问(x,y)输出以(x,y)为左上角,宽度为B的子矩阵里面最大值和最小值之差。2.二维RMQ的裸题了,dp[i][j][a][b]代表的是当前点在(i,j)到(i+pow(2,a),j+pow(2,b))的最值。询问也是一样。模板题。#include<iostream>#include <string.h>...原创 2019-04-28 23:30:05 · 205 阅读 · 0 评论 -
【HDU 3183】下标RMQ
1.题目链接。题目大意:给定一个n位的十进制数,删去m位,让剩下的值最小。2.这个题目显然贪心,开始想的是从前到后查找逆序删除,因为从高位删除是最优(此处没有证明。。。。),然后删除每一个元素之后,就继续对这个数组进行相同的操作,循环m次即可。涉及到元素的删除,我们可以下一个双向的链表来实现这个操作。但是仔细的想一下,因为删除的过程中,我们需要保持余下的元素相对位置不变,其实就是说挑选n-m个...原创 2019-04-28 22:42:46 · 275 阅读 · 0 评论 -
【HDU 4819】Mosaic
1.题目链接。二维线段树维护的使用。每一个节点都是一段区间,给这个区间建一颗线段树维护区间的信息。操作基本是类似的。#include<bits/stdc++.h>using namespace std;const int INF = 1e9 + 10;const int MAXN = 1010;#pragma warning(disable:4996)struct No...原创 2019-05-07 16:23:35 · 211 阅读 · 0 评论 -
【HDU 2586】How far away ?
1.题目链接。题目大意:在一棵树上,每条边都有一定的边权,求u到v最小的边权和。2.LCA模板题,找到u和v的最小公共祖先,从这里走是最优的。这里采用的是Tarjan算法离线求LCA。#include<bits/stdc++.h>using namespace std;const int N = 50005;vector<int> v[N], w[N], q...原创 2019-05-21 15:59:25 · 125 阅读 · 0 评论 -
【HDU 2222】Keywords Search
1.题目链接。题目大意:给定多个单词,一段文本,找出这段文本中出现过多少个给定的单词。要是单词只有一个,直接KMP完事,但是单词多个就不行了,这是典型的多模式匹配算法。对于多模式匹配算法,我也是刚刚学了,因为之前字符串算法都是交给其他的队友完成。推荐文章:https://www.cnblogs.com/cmmdc/p/7337611.html。 里面写了AC自动机的详解:其实就是树上KMP完事...原创 2019-06-05 16:11:02 · 345 阅读 · 0 评论 -
【HDU 6602】Longest Subarray
1.题目链接。题目大意,定义一个好的序列是这样的,序列中的每个数至少出现k次,找出给定序列中好的序列最长的哪个,输出长度即可。2.这个题目开始写了一个分治T了,分治的思想大概就是:首先我们用出现次数小于k的数把区间划分,然后答案一定在这些区间里,然后继续做这样的操作分治下去,直到出现合法的区间,然后统计答案。但是这存在一个问题,就是会出现快速排序中的那种问题,快排中如果你的划分支点选的不好,很...原创 2019-07-26 19:20:20 · 224 阅读 · 0 评论 -
【LibreOJ 6278】
1.数组分块。这个题目用分块写非常优雅,而且简单。#include<bits/stdc++.h>const int N = 1e5+10;using namespace std;int n;int block, sum;int a[N];int pos[N], tag[N];vector<int> v[N];void init() { block =...原创 2019-08-04 16:31:42 · 243 阅读 · 0 评论 -
【HDU 6610】Game
1.题目链接。题目的意思其实就是在问:先把数列做一个前缀异或和,然后给定区间【L,R】,算一下区间内有多少对数异或值不为0.我们知道,只有两个相等的数异或起来才是0,所以再转化计算其对立问题:区间内有多少个相等的数,对于每个数,我们统计一下它在区间内出现了多少次,然后对答案的贡献就是:C(num,2).把这些全部加起来,就是所有异或和为0的答案,总方案数减去这个答案就是结果。其实就是一个带修莫队的...原创 2019-08-04 12:51:16 · 306 阅读 · 0 评论 -
【HDU 5536】Chip Factory
1.题目链接。给定一个数组,找出来不相同的三个数使得(s[i]+s[j])^s[k]最大,并且输出这个最大值。2.N^2枚举两个数,然后对这两个数先把他从字典树上删除,删完之后再查询和的最值,复杂度O(32*N^2).#include<bits/stdc++.h>#define LL long longusing namespace std;const int maxn...原创 2019-07-11 19:23:45 · 231 阅读 · 0 评论 -
【HDU 4825】Xor Sum
1.题目链接。题意:给定一个数组和N组询问,每组询问输出一下这个数组里和该元素异或的最大值。2.字典树的应用,把数位当作字符串然后建一棵01字典树,这个数的高度最多是32层,然后对于每个数,找出数位之后,贪心的在树上找和它数位不一样的地方,从高位开始找,这样异或起来数值一定是最大的。#include<bits/stdc++.h>using namespace std;#d...原创 2019-07-11 09:53:16 · 247 阅读 · 0 评论 -
【POJ 2104】&HDU 2665 K-th Number
1.题目链接。静态区间第k大,主席树的模板题。2.主席树是个啥玩意,也是刚刚学会(之前都是上模板,现在基本上可以做到手写问题不大),可持久化权值线段树。啥叫可持久化数据结构?就是说如果我又n个操作,现在我在第k个操作,操作完之后,这个数据结构发生了一点改变,现在我想知道第t(t<=k)个操作,这个数据结构是什么样子的,访问它的信息。能够做到这一点的数据结构,就叫做可持久化数据结构。一言以...原创 2019-07-10 15:08:00 · 190 阅读 · 0 评论 -
【P3806】点分治模板
1.题目链接。给定一棵有n个点的树,询问树上距离为k的点对是否存在。树上距离定义为两点之间的路径和。(可以知道,树上两点路径是唯一的,因为不存在环)。点分治的模板题,基本思想就是通过选取一个点,把树分割成不同的子树,然后在子树里解决,采用分治思想,之所以叫做点分治,因为是以点作为标准来实现分治。本题首先找到树的重心,这个一遍dfs即可找到,然后从这里开始对这个点的每颗子树分治,分治的过程中,rem...原创 2019-07-12 17:13:10 · 135 阅读 · 0 评论 -
【P 2408】本质不同的字串的个数
1.题目链接。求一个字符串本质不同的字串有多少个?本质不同定义为:两个字符串不相等。2.这个问题其实十分的简单,从后缀数组的角度来看,对于每一个sa[i],我们知道sa[i]代表排名为i的这个后缀所在的位置,假设是j,那么这个后缀的长度就是n-j.他有n-j个前缀,这些前缀都是这个字符串的子串,可以证明(所有的子串都是可以从这些后缀的前缀产生,从数量上就可以证明,二者相等)。但是我们从高度数组...原创 2019-07-08 14:41:51 · 4838 阅读 · 0 评论 -
【POJ 3261】Milk Patterns
1.题目链接。题目大意:给定一个字符串,求一个字串,这个字串在母串中出现了K次并且长度最长。输出这个最长的长度。2.应该算是后缀数组的经典题目了,首先求出SA和高度数组之后,二分一下答案即可。这里简单的解释一下,我们知道,Height数组的意义:Height[i]=lcp(sa[i],sa[i-1])。也就是说,height[i]的意义就是排名第i和第i-1的后缀的最长公共前缀,这个前缀就是我...原创 2019-07-08 14:23:36 · 178 阅读 · 0 评论 -
【HDU 4032】线段树单点更新+区间最值
1.题目链接。题目大意:在一段长为n的线段上,有m个操作。某人起始点在0,现在他想吃馅饼,m个操作种,第一种为在某个点长出来一个馅饼,第二个为这个人要开始吃馅饼。吃馅饼的时候,总是找距离的当前点最近的那个点去吃,如果发现有两个最近点,那么就按照上一次的方向去吃。问最后操作完,这个人走了多长的距离?2.首先分析,我们需要维护的变量肯定是有curpos,当前点在哪。然后对于当前点,我们需要找到最近...原创 2019-05-03 15:02:47 · 292 阅读 · 0 评论 -
【codeforces 1154E】stl使用
1.题目链接。题目大意:n个人分成两组,人的编号是1-n。每个人都有一个val。现在分组的规则是这样的,首先选区val最大的以及左右k个作为第一组,第二轮挑选也是从剩下的中间挑选出val最大的及其左右两个,现在问你最后的分组情况。2.首先根据val排序,放入队列。在后对于每次挑选,从队列里拿出元素,使用一个set维护一下下标。把左右的值存起来,然后从set里面删除。其实就是考察了一下STL用的...原创 2019-04-23 22:29:10 · 344 阅读 · 0 评论 -
堆的结构原理以及堆排序的实现
1.不多说了,我想直接上代码。#pragma once#include<cstdio>#include<iostream>using namespace std;template<class T>class MinHeap{private: //申请堆空间 T *_minHeap = NULL; int CurSize, _maxSiz...原创 2018-11-02 09:26:26 · 319 阅读 · 0 评论 -
HDU1166树状数组裸题
1.题意就不在介绍,只放一张图和AC代码,因为这个东西的思想和线段树有异曲同工之妙,所以不是太懂的只需要看一下线段树是怎么实现的。 #include"stdafx.h"#include <iostream>#include <algorithm>#include<string>using namespace std;const int max...原创 2018-10-29 19:25:53 · 254 阅读 · 0 评论 -
KMP裸题
题目描述:给定一个字串,求这个字串在母串中出现的次数。(注意这里的匹配是一种类似于贪婪匹配的模式,意思就是如果当前的字符被在一次匹配成功了,他依然可以参与下一次的匹配).这是一个KMP的裸题,KMP算法就不再说了,知道它的思想:使用字串本身的信息来简化匹配的次数,最重要的是NEXT数组的理解。下面给出具体的实现的代码:#include<iostream>#include<...原创 2018-10-20 11:58:06 · 293 阅读 · 0 评论 -
ACM_二分(POJ1064)
1.二分法求解问题的这种思想其实十分的普遍。回忆一下我们在求一个方程的近似根的时候其实使用的就是二分的办法,当然这种求近似根的方法是有一定局限的,因为这样无法求不变号的零点,也就说哪种曲线刚刚好与坐标轴相切的零点我们通过普通的二分是无法求得的。但是,二分求近似根这种方法体现出来的二分思想其实是可以被用来解决很多的问题。2.二分查找。如果我们在一个有序的数组里查找不大于某个数最大的下标,其实我们...原创 2018-10-17 08:42:37 · 743 阅读 · 0 评论 -
火车重排(oop)&双队列模拟栈
1.首先是火车的重排问题:这个问题的大概意思就是给你一个关于n个正整数的排列和k个队列,判断是否可以通过这K个队列完成这n个数的排列,排列的结果是从n到1依次递减并且队列里面的数还需要依次递增。首先我们可以简单的分析一下这个问题:需要明确的是,使用k个队列(也就是题目中的铁轨)是不一定可以完成数字的重排的。为什么呢?因为我们可以想到,假设数据非常的恶心,最多是n-1个队列。如果这个时候k<...原创 2018-10-09 10:55:53 · 606 阅读 · 0 评论 -
快速幂与矩阵快速幂的总结以及应用
1.首先我们来看一个题:求A^B的最后三位数表示的整数。说明:A^B的含义是“A的B次方”Input输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。Output对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。这是一个求幂运算的ACM试题,是...原创 2018-07-31 14:47:43 · 1019 阅读 · 1 评论 -
浅谈链表(1)--链表的构建以及遍历输出
1.在学完c++的基本语法之后,可能我们在组织一类相似的数据时首先想到的就是数组,至于数组,它的大小在某种意义上还是固定的,即使是可以动态分配内存。(当然vector在一定程度上解决了这个问题,之所以说是一定程度上,是因为vector只是一个数组对象,它重载了[]运算符,才让我们感觉他比较像数组,实际是他不是一个数组。)而且,很多时候,我们需要在这个群体里面添加元素与删除元素,或者在内存已经受到限...原创 2018-06-14 21:54:59 · 1535 阅读 · 0 评论 -
浅谈链表(2)——节点的插入与删除
1.在上一节中,我们完成了最基本的操作——链表的创建,现在我们来做一下其他的操作。这也是链表相对于数组最大的优势所在——数据的插入与删除。(还是基于单链表)2.在链表中插入一个数据。插入数据也就是插入一个节点.现在我们来考虑如何插入,首先需要知道插入的位置,这个由外界数据给出。当我们知道把数据插入到链表中的哪个位置之后,就开始着手如何插入。我们从链表的结构出发来思考,首先链表是用指针链接起来的...原创 2018-06-15 16:58:48 · 2338 阅读 · 0 评论 -
栈的两种实现
1.在线性表中,栈是一种简单但是十分重要的数据结构,栈内元素先进后出,元素出栈,入栈,以及栈内查找等。在c++程序中,程序在编译之后被分为了五大块,其中就有栈区。栈区存储着程序中的局部变量等重要的数据,但是系统内提供的栈和我们自己实现的栈有一点区别。系统栈的内存分布是,栈顶指针一直指在高地址,元素入栈之后指针的值会减小,所以内存是从高到底排列,但是对于我们自己实现的栈是相反的。这里我没有使用栈顶指...原创 2018-07-05 15:09:34 · 262 阅读 · 0 评论 -
队列的两种实现
1.队列也是一种线性的数据结构,队列的特征是先进先出,单向队列从队尾进去,队头出去。这种数据结构在程序里面的应用十分广泛。例如:在OS中,多进程的并发执行就是将就绪状态的进程(这个分类标准不唯一,我们简单的讨论一下ready的进程)排成一个队列,依次执行,一个进程下面的多线程也是如此。这一节我们采用数组(连续储存的方式)和链表(链式储存的方式)分别实现队列。/*队列的基本实现*/#inclu...原创 2018-07-07 14:24:26 · 827 阅读 · 0 评论 -
希尔排序和归并排序
1.首先说一下为什么要搞这些东西。当然是数据结构考试啦,再来复习一下数据结构以及一些常用的算法,平时都是用的是sort真的自己敲了一下发现还是不容易一次敲对的。2.首先是希尔排序,ShellSort,没错这个排序方法就是希尔发明的,作为第一个打破排序时间复杂度O(n^2)的方法。首先我们需要知道什么是交换排序,其实交换排序就是很简单的一个思想,假设第一个元素已经是OK的,那么后边的元素一次...原创 2018-12-21 18:07:53 · 4416 阅读 · 0 评论 -
二叉树的非递归遍历的实现
1.前言:当然了,这也是复习。因为数据结构要考试了,把之前的算法拿出来敲一遍。2.二叉树的遍历是一个基于二叉树很重要的操作,应用也很多。我们知道递归是树的特性,所以树上的所有算法几乎都是基于递归做的。但是在一些嵌入式设备中,系统栈不允许很深的递归。这时候就要把递归的算法转换为非递归算法,嗯,没错,应用场景看上去有点实际,但是真正促使我的还是考试,哈哈。先给出一个遍历的递归算法把。ty...原创 2018-12-21 20:51:05 · 2436 阅读 · 0 评论 -
【POJ2823】单调队列
1.题目链接。题意:给一个数组和一个长度k,询问从k到n,每个长度为k的小区间,输出区间(i-k,i)这个区间的最大最小值。2.分析:这是一个滑窗的裸题,我们采用单调队列解决它。单调队列听名字就知道它是单调的了,就是我们基本的队列的延申,一般是一个双端的队列,可以从尾部入队,两端都可以出队。我们看待这个问题,就相当于有一个窗口大小为k,在数组上滑动。也叫做滑动窗口。通过这个滑窗,我们可以找到这...原创 2019-02-09 20:28:15 · 236 阅读 · 0 评论 -
【HDU 1806】RMQ秒之
1.题目链接。题目大意,给定一个不递减的序列,询问时区间询问,[l.r]种出现最多的数出现了多少次?2.开始题读错了,以为是让我输出这个数是多少???然后看了一下样例,发现题读错了,行吧,正解可以用权值线段树,最简单那就是RMQ了。做一个C数组,C[i]代表a[i]已经在前边出现了多少次,对于每一个询问,然后首先分割区间,因为我们需要找到一个起点做RMQ,也就是我们找到,一个C[i]=1的地方...原创 2019-04-27 23:41:00 · 135 阅读 · 0 评论 -
【HDU 4267】三维树状数组
1.题目链接。题目的操作其实很像去区间修改,区间查询的操作了,但是这个操作的区间不再是连续的了,而是离散的。但是这里还是可以用树状数组维护的,因为k很小,所以k和i%k其实只有C(10,2)种情况,我们对每一种情况建一颗树状数组,然后查询的时候查对应的树状数组即可。#include<bits/stdc++.h>using namespace std;#define lowbi...原创 2019-04-27 20:49:01 · 308 阅读 · 0 评论