随笔分类 - 数据结构与算法
摘要:题目描述:给定一个n*m的矩阵,矩阵的每一行都是递增的,每一列也是递增的,给定一个元素target,问该target是否在矩阵中出现。 思路:先从最左下角的元素开始找,三种情况: 1. 如果该元素大于target,说明target一定不会出现在最后一行中(因为最后一行也是递增的,其他的更大于targ
阅读全文
摘要:这个题直接暴力求解的话时间复杂度肯定是不行的,所以,我们要计算每个数值的贡献,对每一个数求他当最小值当了多少次,当最大值当了多少次,最后当最大值的次数乘以这个数值减去当最小值的次数乘以数值就得到这个数的贡献,依次把这n个数的贡献加起来就是整个极差之和。 在计算一个数当了多少最值的时候,我们要理解问题
阅读全文
摘要:题意:给一个排列的每个前缀区间的逆序对数,让还原 原序列。思路:考虑逆序对的意思,对于k = f[i] - f[i -1],就表示在第i个位置前面有k个比当前位置大的数,那么也就是:除了i后面的数字之外,它是在剩下的数字当中第k+1大的。知道这个之后,可以用树状数组来帮助找出剩下的数中第k大的数,刚...
阅读全文
摘要:题意:给定三种操作 1. add x 向序列中添加x,添加之后序列还保持有序 2. del x 删除序列中值为x的元素 3. sum 求下边模5等于3的元素和思路:直接暴力也可以过,就是看暴力写的好不好了。用数组直接暴力可过。暴力代码:#include #include #include us...
阅读全文
摘要:给定一个矩阵,查询一块子矩阵的最大值和最小值,然后他们和的一半替换(x, y)这个位置,裸的二维线段树。和一维差不多,只不过是一维当中保存的是最值,而这个保存的是个数组而已,而这个数组也是个一维的线段树,所以就是二维线段树。具体见代码注释。#include #include #include usi...
阅读全文
摘要:盗张图:来自http://blog.csdn.net/xuechelingxiao/article/details/39494433题目大意:有一排建筑物坐落在一条直线上,每个建筑物都有一定的高度,给出一个X坐标,高度为0,问X位置能看到的视角是多少度。如图:图一:图二:图一为样例一,图二为样例三,...
阅读全文
摘要:问题一:矩形嵌套问题: 给定n个矩形,每个矩形有个长和宽,只有当一个矩形的长宽小于另外一个矩形的长宽时,才能嵌套在另外一个矩形内部。求出尽量多的矩形排成一行,嵌套的矩形数目最多。这个问题其实就是求最长上升子序列,只不过比较大小的时候变成了比较两个变量。#include #include #inclu...
阅读全文
摘要:入门看这篇http://blog.sina.com.cn/s/blog_7a1746820100wp67.html一个入门题目QTREE - Query on a treeno tagsYou are given a tree (an acyclic undirected connected gra...
阅读全文
摘要:这个题如果用邻接矩阵的话,由于n比较大,会超内存,所以选用邻接表的形式。还有就是这个题有那个等级的问题,一级比一级的福利高,所以不能直接拓扑排序,而是反过来,计算出度,找出度为0的顶点,然后更新出度数组,等级更新的时候要判断是否比原来的等级大,具体看代码 1 /*******************...
阅读全文
摘要:这个题是个模板题,可以直接用拓扑排序的模板来做,AC代码#include #include#include using namespace std;const int N = 1000;int n, m;int Map[N][N];int topNum[N];bool toposort(int *r...
阅读全文
摘要:这个题是个典型的最小生成树的题目,但是刚开始怎么都过不了,后来发现两种写法都有疏忽,但是prim的到目前为止不懂为什么刚开始的不对,kruskal算法,并查集的初始条件从0开始写成从1开始了,所以已知wa,还有这个题比最小生成树一个卡点就是处理两点之间的距离的时候,要保证点都在10-1000之间。其...
阅读全文
摘要:Dijkstra算法描述起来比较容易:它是求单源最短路径的,也就是求某一个点到其他各个点的最短路径,大体思想和prim算法差不多,有个数组dis,用来保存源点到其它各个点的距离,刚开始很好办,只需要把邻接矩阵里面它到其它点的距离复制过来就行了。剩下的步骤就是找到一个源点到其他点最小的距离,将它加入到...
阅读全文
摘要:问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成第二个图所示的局面。 我们把第一个图的局面记为:12345678. 把第二个图的局面记为:123.46758 显然是按从上到下,从左到右的顺序记...
阅读全文
摘要:过了这么久,终于知道了辗转相处的证明了,以前只是记住了,但不是真的很理解,现在写一下它的证明,以便下次忘了的时候看一下。辗转相除是求两个数的最大公约数的。要证这个定理成立,只需要证明 gcd(a, b) = gcd(b, a % b) 就行了证明:令a % b = r, 所以a = k * b + ...
阅读全文
摘要:这道题是刚好装满的背包问题,刚好选取k个,状态转移方程为dp[i][j] = max( dp[i - 1][j], dp[i - 1][j - 1] + Li - Bi(j - 1) )dp[i][j] 表示从前 i 个男孩中选取 j 个的 Li 的最大值, 首先按照Bi 排一下序,这个是利用贪心的...
阅读全文
摘要:主元素这个问题,有个nlogn的算法,但是还有比它更快的,有O(n)的算法,基本思想是,从头到尾遍历,先将第一个元素保存到一个变量中,然后依次往后遍历,每遍历到与它的值相同的元素时,就要将它的个数+1,不同时-1,这样是因为如果存在主元素,那么主元素的个数一定是大于n/2的,所以最后这样抵消下来剩下...
阅读全文
摘要:这个问题直接用4个while循环就可以写出来,注意一下边界处理就行了 1 #include 2 #include 3 int a[103][103]; 4 int main() 5 { 6 int n; 7 while(~scanf("%d", &n)) 8 { 9 ...
阅读全文
摘要:lower_bound它有三个参数, 第一个和第二个是给定区间起点和终点的指针,第三个参数是要查找的数,它的作用原理是在给定的区间中进行二分查找,这个二分区间是前开后闭的,他返回第一个大于等于它的函数指针,例如数组a[100] = {3, 4, 5, 6, 7, 10, 12, 34, 55}; 想...
阅读全文
摘要:这类带权的边的图,直接广搜不行,要加上优先队列,这样得到的结果才是最优的,这样每次先找权值最小的,代码如下 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 typedef struct No...
阅读全文
摘要:平衡二叉树(AVL)是一种特殊的二叉搜索树,他满足两个性质:1. 此树是二叉搜索树2. 任意节点的左右子树高度差的绝对值不超过1这样是为了提高查询的效率,因为一般的二叉搜索树有可能不会是完全二叉树或者接近完全二叉树情况,有的甚至退化成链表,所以平衡二叉树将二叉树平衡一下,使得查询效率满足logn,主...
阅读全文

浙公网安备 33010602011771号