
常用技巧——扫描与信息维护
文章平均质量分 79
XDU_Skyline
Everything is over, everything is just beginning.
展开
-
例题1.22 最大子矩阵 UVa1330
1.题目描述:点击打开链接2.解题思路:本题利用扫描法解决:从上向下扫描每一行,如果我们把每个格子向上延伸的连续空格看做一条悬线,并用up(i,j),left(i,j),right(i,j)表示格子(i,j)的悬线长度以及该悬线向左,向右能够运动的“运动极限”,即最远能够走到哪一列。这样,每个格子(i,j)对应着一个以第i行为下边界,高度为up(i,j),宽度为right(i,j)-left(原创 2015-03-15 19:45:31 · 639 阅读 · 0 评论 -
POJ 3320 Jessica's Reading Problem
1.题目描述:点击打开链接2.解题思路:本题利用尺取法解决。根据题意,如果我们从第L页开始阅读,读到第R页才能恰好覆盖到tot个知识点,那么如果我们从L+1页阅读,必须阅读到大于等于R页为止。因此可以采用尺取法。那么如何进行区间的转移呢?根据题意,我们需要动态地维护区间中知识点的个数num,因为每个知识点出现的次数是不同的,我们可以用一个map来维护每个知识点在当前区间的次数,如果R向后移动一原创 2015-09-18 12:55:57 · 328 阅读 · 0 评论 -
POJ 3276 Face The Right Way
1.题目描述:点击打开链接2.解题思路:本题的模型是开关问题,可以通过枚举k,然后用贪心法来求解。假设当前设定的数值是k,那么怎么求出最少的翻转次数呢?可以贪心考虑,如果第一头牛朝前,那么不需要处理它,问题规模缩小了1;如果第一头牛朝后,那么对应的区间就必须翻转了,而且以后这个最左的区间就再也不需要考虑了。而且考虑到对同一个区间进行2次以上的翻转操作是没有意义的,这样,翻转的次数就可以唯一确定原创 2015-09-18 13:47:28 · 311 阅读 · 0 评论 -
HDU 5400 Arithmetic Sequence (2015年多校比赛第9场)
1.题目描述:点击打开链接2.解题思路:本题利用扫描法解决。根据题意描述,[L,i)和[i,R)区间都构成了等差数列,因此可以实现用L[i],R[i]来维护从i开始向左向右可以延伸的最远长度,如果d1和d2不等,那么答案就是L[i]*R[i]求和,否则就是R[i]求和。3.代码://#pragma comment(linker, "/STACK:1024000000,102400000原创 2015-08-18 22:44:19 · 686 阅读 · 0 评论 -
#305 (div.2) D. Mike and Feet
1.题目描述:点击打开链接2.解题思路:本题是一道很好的思维题。看好多人用单调栈解决的。这里介绍另一种解决方法:首先,根据题意描述,我们知道连续序列的最小值是关键,如果任意给出一个连续序列,找它的最小值,反而不太方便;但是换个角度,如果知道最小值,求以它为最小值的最大的连续序列!这就简单的多了。即找出这个元素向左可以延伸多远,向右能延伸多远,然后就能求出最大连续序列的长度了。现在的问题是,原创 2015-05-28 13:21:24 · 777 阅读 · 0 评论 -
POJ 2559 Largest Rectangle in a Histogram
1.题目描述:点击打开链接2.解题思路:本题利用单调栈解决。单调栈是满足从栈顶到栈底,元素大小严格递增或者严格递减的栈。对于本题,如果我们可以知道以i为端点,向左可以最远延伸的距离和向右最远延伸的距离,那么最大面积res=max{hi*(R[i]-L[i])|0那么如何高效地计算L[i]和R[i]呢?通过观察我们发现如果在某一处p有h[p]3.代码://#pragma commen原创 2015-08-16 11:25:59 · 626 阅读 · 0 评论 -
#290 (div.2) D. Fox And Jumping
1.题目描述:点击打开链接2.解题思路:本题利用扫描与维护解决。根据题意,能够走到所有的格子,一定是挑选出来的牌的步数的最大公约是1,这点很好理解。因为ax+by=1意味着只要有a个x和b个y就可以凑出来步数1。这样以来,只需要利用map来存储所有的公约数对应的最小费用即可。初始时刻base[0]=0,接下来就是从前往后扫描一遍这n个数,然后依次更新base中的每一个最大公约是对应的最小费用即原创 2015-04-12 23:24:59 · 575 阅读 · 0 评论 -
HDU 1003 Max Sum
1.题目描述:点击打开链接2.解题思路:本题是经典的最大连续和问题,效率高的解决方法有两种:(1)利用公式:A[i]+A[i+1]+...+A[j]=S[j]-S[i-1];(2)利用动态规划;(3)边读入边计算(精简版的动态规划)。对于(1),二重循环还是会TLE的,应该事先计算好0~j之间的最小值及其位置。对于(2)定义d(i)表示以i结尾的最大连续字串的和,再用一个辅助变量保存开始值s,原创 2015-02-12 20:55:27 · 518 阅读 · 0 评论 -
例题8-6 两亲性分子 UVa1606
1.题目描述:点击打开链接2.解题思路:本题利用极角扫描法解决。极角扫描法的思想是这样的:首先,选择一个点作为基准点,然后求出其他点相对于该基准点的相对坐标,同时求出相对坐标系下的极角。对这些点按照极角由小到大排序。设L=0,R=0,那么每次都以O-p[L]这条线为分隔线,O-p[R]作为扫描线,用cnt来统计在分隔线左侧的点的个数(包括分隔线上的点)。看p[R]这个点是否在分隔线的左侧,如果原创 2015-08-24 16:14:26 · 2146 阅读 · 2 评论 -
例题8-8 防线 UVa1471
1.题目描述:点击打开链接2.解题思路:本题要求在一个长度为n的序列中,删除一段连续子序列,使得剩下的序列有一个长度最大的连续递增子序列。按照以往的经验,可以事先用f[i]计算出从i出发的最长连续递增子序列的长度,用g[i]表示以i结尾的最长连续递增子序列的长度,然后枚举j,i(j本题的优化环节就在于已知一个i,如何快速找到一个j。由于我们希望得到的连续递增子序列尽可能的长,那么我原创 2015-08-24 22:25:00 · 1313 阅读 · 0 评论 -
例题9-8 颜色的长度 UVa1625
1.题目描述:点击打开链接2.解题思路:本题利用区间dp解决,但是本题是一道比较复杂的区间dp,做法不太容易理解,需要慢慢分析。首先,题目要求我们寻找一种合并的方式,使得最后的总代价最小,这里的总代价就是题目中所说的不同字母的L(i)值的和。然而本题不能按照以往的经验,把两个序列分别已经移动走了i和j个元素,还需要多少代价作为状态,因为这样的定义并不知道某个字符什么时候会结束,而当字符结束时候原创 2015-08-23 17:22:28 · 905 阅读 · 0 评论 -
最优规则式 XDU1024
1.题目描述:点击打开链接2.解题思路:本题要求找到四个数,满足aLeft[i]=max{Left[i-1],arr[i-1]-minx};上式中,minx是区间[0,i-1)上的最小元素。同理可得Right数组的递推式:Right[i]=max{Right[i+1],maxx-arr[i]};上式的maxx表示区间[i+1,n)上的最大元素。每次都可以只用O(N)的时间即可算原创 2015-04-27 23:01:55 · 716 阅读 · 0 评论 -
例题1.18 开放式学分制 UVa11078
1.题目描述:点击打开链接2.解题思路:本题一看n的范围高达100000,肯定只能用O(N)的复杂度解决。本题类似于最大连续和问题,事先计算区间[0,i)的最大值,存放到_max数组中,然后扫描整个数组,不断用max(ans,_max[i]-a[i])更新最大差值即可。3.代码:#define _CRT_SECURE_NO_WARNINGS #include#include#in原创 2015-03-12 22:09:10 · 703 阅读 · 0 评论 -
例题1.23 遥远的银河 UVa1382
1.题目描述:点击打开链接2.解题思路:本题要求找一个矩形,使得边上的点数最大。看上去比较棘手,如果只是单纯地枚举每行,每列,再加上要统计点数,时间复杂度会高达O(N^5),无法承受。因此,需要转变思路。做了这么多题,会发现,这种带有统计目的的题目常常采用的策略就是先扫描,计算出一些必要的信息,例如前缀和等。将来处理时就能用O(1)时间得到想要的结果,便于寻找某种最优值。本题照样如此。对于原创 2015-03-15 22:06:40 · 857 阅读 · 0 评论 -
UVa 1709 Amalgamated Artichokes
1.题目描述:点击打开链接2.解题思路:这是今年World Finals 的最简单的题。因为给的时间相当的宽,所以只需要提前计算出最大值后,用ans=max(mx[i-1]-y[i])更新答案即可。3.代码:#include#include#include#include#include#include#include#include#include#include原创 2015-10-09 22:29:00 · 829 阅读 · 0 评论