刷题笔记
每一个想不出来的题目,都要在看答案之前记录自己的尝试和想不出来的痛苦。
提醒笔记:二分,DP,暴力+记忆化搜,换维(row,col,映射关系倒置,(时间空间)顺序逆序...)
盲目自信下,往往会认为想出一道题的时间复杂度是O(1),其实不然,自己的能力vs算法的正确数学建模是:能力决定思维跨度,算法是个有向图。从问题到解,每一路径上的边都在自己能力范围内,那就可以在有限时间内达到解。而我说这些是要强调,自己开始想不出,想想还是想不出,是因为问题到解的路程长,大概三步可能就算很难的了,却并不是必须一步到达,很多的内部本质规律需要手算一下才能展现出来。出题人顺着思路出,中间设坎两三个,都需要你来逆势想出来,然后逐个解决。http://codeforces.com/contest/1203/problem/D2然后看了题解,已经感受不到自己为什么会被这2b题目卡住,不如当时心平气和去做,毕竟那题目tourist去做也要想一会。do anything is better than do nothing.
1.在遇到区间排序的问题之后,我发现了其貌不扬的二分解优化问题的强大。
2.最近遇到的几个题目,鱼丸肉丸分碗,maxmin树的最值(http://codeforces.com/contest/1153/problem/D),涂色(http://codeforces.com/contest/1150/problem/D),等等,让我发现:dp的应用范围广到你不用专门为dp出题就不小心找到了一个dp的应用。
3.综上两条所述,那些a题到手软的大佬都是唯手熟尔,一个问题从0开始思考是很难的,他们的工具箱很充足,使用工具的经验也非常丰富。自己拿到一个题,要check工具箱:二分,dp
4.关于dp与bfs,dfs之间的神奇关系的两道题目:
https://leetcode.com/problems/race-car/
https://leetcode.com/problems/unique-paths-iii/
5.除了二分,dp之外,添加另一个主动check是否能解的方法,倒序
https://leetcode.com/problems/bricks-falling-when-hit/
真的是很难想到的角落。
按照游戏顺序做,是每次bfs=O(200^2),然后次数=O(200^2)
逆序去做:O(200^2)效果惊人
6.遇事不决先排序,不知何解就二分,问题复杂dp线段树。图转树,后遍历。滑动窗口vs双指针。 数组求值优化想想单调队列单调栈。dp换维能优化。dp难做就加维。
7.排序题。两两间比较结果有传递性。比如list[str]排序后练成一个str使该str字典序最大。如两个key一个正序排一个倒序排。如https://codeforces.com/contest/1203/problem/F2这个牛逼哄哄的排序题,排序也是唯一突破口,自己却没发现,用到的一个本质就是冒泡那样子交换相邻两元素也是排序本质。还有一种排序,就是多个key间通过复杂公式比较,i,j两个的key混淆在不等式两边(如果你已经找到了此公式的话),那么一般要让i在左边,j都在右边,化相对比较为绝对比较(之前kick start的一个题目就是,先排序再背包的经典套路)。
8.递推关系式->矩阵递推公式->矩阵快速幂。又一个用小本子记下的姿势!!!
------------- | ------------------------ | --------------------------------- |
google的区间排序问题 | ||
google的插入新传送门的问题 | ||