算法乱刷
一些力扣乱刷,旨在复健(大部分都是口胡)。
也有一些洛谷上的题。
42.接雨水:
单调栈。
32.最长有效括号:
数据结构oj原题,标记所有无效括号的位置即可,用栈维护。
84.柱状图中最大的矩形:
单调栈。
85.最大矩形:
对每一行跑一个单调栈。
224.基本计算器:
中缀转后缀模板题。
402.移掉k位数字:
每次移除序列中最靠左的极大值点,重复k次
321.拼接最大数:
考虑k=m+n的时候如何做:两个指针分别指向两个数组的头,哪个指针指的大就选哪个,然后对应指针右移,循环往复这个做法遇到两个头的数值一样的时候会出问题,一样的时候看选第一个和第二个哪个更优。当k<m+n的时候,需要在其中一个序列删若干个数。假设序列1删s个数,那么这个序列按照402题的方法删去s个数,序列2按照相同方法删掉一些数,删完的序列合并的方法即k=m+n时的做法。最外层枚举s。
214.最短回文串:
等价于求最长回文前缀。可以哈希,也可以KMP。KMP的话就让模式串为原串,文本串为翻转之后的串。当文本串匹配到第n位的时候模式串已经匹配的长度就是最大回文前缀的长度。
1392.最长快乐前缀:
KMP。
1397.找到所有好字符串:
数位DP。
135.分发糖果:
把题意拆分为两个约束条件:\(rating(i-1)<rating(i)\)则\(i-1\)处的值小于\(i\)的值,\(rating(i)>rating(i+1)\)则\(i\)处的值大于\(i+1\)处的值
先考虑让所有位置满足前一个条件,设满足前一个条件下\(i\)处取值\(a(i)\),若\(rating(i-1)<rating(i)\)则\(a(i)=a(i-1)+1\),否则\(a(i)=1\),发现这么做的话就是只满足前一个条件时候的最优解
考虑如何满足后一个条件:同样的设\(b(i)\)为满足后一个条件下的\(i\)处取值,\(b(i)\)求法类似\(a(i)\),答案就是\(\sum max(a(i),b(i))\)
330.按要求补齐数组:
一开始的思路就有问题QAQ
考虑nums空的情况,发现\(1,2,4,...,2^i\)这么组成会让用到的数最少(而不是\(1,2,3,4,5,...\)),然后发现如果\([1,x-1]\)已经被覆盖,则加入\(x\)可以让\([1,2x-1]\)被覆盖。
于是初始设\(x\)为1,然后扫描数组,如果扫到的元素\(nums(i)\)在覆盖范围内则调整范围到\([1,x+nums(i)-1]\),否则不断让\(x\)乘2直到满足上述条件或\(x>n\)
时间复杂度\(O(m+logn)\)
P7831 [CCO2021] Travelling Merchant
假设边\(u->v\),容易想到\(f(u)\)可以通过\(f(v)\)求解,但是图中可能有环,无法用这种方法求出。但是我们发现对于一个环(或者扩大到整个图),初始资金为最大的\(r_i\)一定可行。于是我们取出整张图\(r_i\)最大的边。对于以这条边为第一条边的路线,答案一定是\(r_i\),于是以该边的起点为起始去更新上游的点。具体来说每次:
1.取出\(r_i\)最大的边,删去该边,更新这条边起点的答案。
2.如果删去该边导致某点出度为0,那么删去所有指向这个出度为0的点的边。
3.如果这个删边过程又导致了某点出度为0,则重复2.
4.重复1
2和3可以用队列维护(实际上类似拓扑排序),每次删边更新边起点的答案,复杂度瓶颈在于排序。
AGC007 Construct Sequences
很有趣的构造题。先不考虑a,b单调的限制,假设所有的a+b都相等,那么就可以让\(a_{p_i}+=i-1,b_{p_i}+=i-1\),就可以满足对于a+b的限制。接下来考虑如何满足a,b单调。假设a,b为单调等差数列,如何让上面的操作不破坏a,b单调性?只需a,b为公差很大的等差数列(假设公差为20000)。
P3243 [HNOI2015] 菜肴制作
考虑如何让图中最小的点拓扑序最靠前。显然走完那个点上游的所有点之后立刻走那个点最优。然后假设整个拓扑序分为\(a,b,c\)三部分,\(a\)为最小点的所有上游点,\(b\)为最小点,\(c\)为走完最小点之后要走的点。让\(a,c\)各自满足拓扑序最优,即可保证总的拓扑序最优。在反图上找点的上游节点比较方便,所以在反图上拓扑。
P4404 [JSOI2010] 缓存交换
在替换的时候替换哪个?肯定是该时间之后某一段时间内出现次数最小的。那么如何找这段时间的右端点?当前缓存内下次出现位置最大的那个元素其下次出现位置就是右端点。下次出现位置最大的元素一定是这段时间里出现次数最小的(最多是1),所以考虑这段时间的话,删该元素最优。而且因为若干段这样的时间段加起来就是整个过程,所以这些时间段的答案加起来就是总答案,局部最优即全局最优。