![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
Martin20150405
博客搬家啦,http://martin20150405.github.io
(邮箱Martin20150405@163.com)
展开
-
[二维线段树](数组实现) HDU 1823 Luck and Love
思路:二维线段树模板题。第一维是身高,范围100-200,第二维是活泼度,范围0-1000。 一开始还在想浮点数要怎么建树,结果愣了半天发现只有一位小数。。。 网上大部分的代码是基于结构体实现,所以自己打了一个数组版本(因为是求最值又没有初始值,所以数组版本不需要Build函数) #include #include #include #include #include #i原创 2016-02-14 13:04:06 · 803 阅读 · 0 评论 -
[树状数组+上升子序列] HDU 3030 Increasing Speed Limits
题意:求一组数有多少严格上升子序列。以1 2 1 2 3为例,他的严格上升子序列有1 2 1 2 3 12 12 13 123 123 23 12 13 123 23 话说这个输入真的好坑,看了半天才看懂,算出来的数还会爆int ...- -||| 思路: 因为要求严格上升,所以同样大小的数只能出现一次。因此可以先对数组进行排序、去重操作。得到的新数组即为离散化的数组,每个数对应的下标即大小原创 2016-02-02 14:23:52 · 1320 阅读 · 0 评论 -
(HDU 5792)2016 Multi-University Training Contest 5 World is Exploding (逆序数、顺序数、树状数组)
思路要求互不相等的a,b,c,d 1. 满足a<ba<b且Aa<AbA_a<A_b,即一个升序对 2. 满足c<dc<d且Ac>AdA_c>A_d,即一个降序对 对于一个升序的序列,其逆序对的个数为∑\sum每个数右侧小于这个数的个数 若一个数大于右侧的一个数,则右侧的这个数一定小于左侧的一个数,显然,升序对个数等于降序对 答案可以通过枚举aa和cc来得到。 因为要求四个数两两不同,所以原创 2016-08-06 21:14:42 · 412 阅读 · 0 评论 -
(POJ 3494)Largest Submatrix of All 1’s (DP、单调栈)
思路求最大子矩阵问题相当于对每一行求最大矩形问题问题,可以用单调栈处理。 因为子矩阵必有开始行和结束行,相当于枚举开始行,然后通过histogram的最大矩形问题保证到结束行为止都是1且最宽代码用自带的栈会超时(因为我用了结构体和scanf的关系)#include <iostream> #include <cstdio> #include <algorithm> #include <cstring原创 2016-08-10 20:35:09 · 910 阅读 · 0 评论 -
(POJ 2559)Largest Rectangle in a Histogram (POJ 2796) Feel Good(DP、单调栈)
思路两题题目类似,都要求出最大矩形,可以用单调栈来处理,小于栈顶元素就不断出栈,保证栈是递增的。 定义左界和右界表示已当前元素为最高高度的连续矩形区域 在出栈时,会更新被出栈元素的右界,同时一个元素的左界在入栈前就已经确定。POJ 2559#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #原创 2016-08-10 20:44:34 · 450 阅读 · 0 评论 -
HDU 3966 Aragorn's Story(树链剖分)
好久没有打线段树了。。题意更新树上的一段路径,查询某个点/路径的权值思路树链剖分模版题,树链剖分将一棵树转化成多条重链,将树的问题变成区间问题 如图,加粗的是重链,打红点的是链的根节点代码#include <bits/stdc++.h>#define mem(a,b) memset(a,b,sizeof(a)) #define rep(i,a,b) for(int i=a;i<b;i++) c原创 2017-04-20 19:07:10 · 601 阅读 · 0 评论