反思集
模拟72
T1 Catalan的综合运用,对Cat的理解还不够深刻。
然后就是对于DP的运用了,DP的状态定义要选好,尽量摒弃多余的、无用的DP,仔细思考定义的DP数组的含义,要根据自己的定义选择自己合适的算法。
对于定义的DP一定不能模糊,一是不好调,二是会造成思维上的混乱,容易跑偏。
定义DP时多方面考虑,选择最适合转移、最适合优化的DP下手。
T3 无向图没有缩点!!!缩的是点双(不存在割点)或边双(不存在割桥),割点可能属于多个点双,割桥不属于任何边双。Tarjan缩点时要理解清楚。
对于特点图的判定,找规律后可以从二分图方向考虑,二分图这个思想还是很重要的(是时候该复习一下最大匹配了)。
算法尽量简单,能省就省,根据题中所述选择最简单的算法,如边权相同直接跑BFS求单源最短路。
复杂度的分析仍然是个问题。对于那些看似“$n^4$ $n^3$”的算法,其实并不会枚举那么多,正确看待复杂度。
点数、边数不同阶的时候,不能同等看待。
模拟73
T2 DP性质题,找性质可以从DP的状态入手,找一下有没有多余运算,适当的进行一下数学分析,不要盲目的暴力。
其实很多时候优化就是除去多余不可行解或者不优解的过程,就像搜索剪枝一样,分析它可能转移到的不可能状态或劣态,达到优化目的。
比如这道题,多余2个相连块的情况不可能优,证明就是用的数学不等式,数学还是很重要的喵。
模拟 74
T1 贪心题。这次贪心把我贪mengbi了,有时候贪心的更优性可能证明不出来,但是使用贪心,不会使答案更劣,这时候也可以贪心,并且能保证答案不会变差。这种贪心也很重要。比如说这道题,我们每次选择离当前所访问的点最近的右端点,的确不会使答案变优,但是我们这样选择之后,能选就选,如果我们出现了选择当前点后,它后面的点不能选的情况,说明它后面的这个点不优。因为如果我们想要选择后面的这个点,就必须舍弃前面的某一个点,但实际做的贡献跟贪心所得是相同的。因此该贪心不会使答案变劣。
T3 解法多种多样,启示也很多。关于二维偏序,不是狭义的$a_i<a_j$ $and$ $b_i<b_j$,形似$a<b$ $and$ $c<d$的我们都可以看作二维偏序,并且以之为方向进行考虑。二维偏序常用的解法就是$sort$$+$$BIT$,排序使其中一维有序,$BIT$用来查询对答案的贡献,一定要深深理解$BIT$的应用,尤其是它动态维护的能力,这个动态思想很重要。关于这道题解法不少,尤其是莫队解法更妙。自己没打莫队,不过稍微理解了一下,大概就是努力将修改做成$O(1)$,好好考虑它的父亲及儿子存在不存在我现在的区间里,进行加减操作,其实加与减形状上差不多,就是互逆运算。主席树打法自己手打了一下,与树状数组思想类似,只是不需要动态维护和离线,在线直接查询就行。二维偏序这个方向好好积累一下,多想想我要固定哪一个端点,方便我查询另一端点,可以在草纸上写下来,画画图,加深印象以免弄混。
还有,联通块=点数-边数。
T2 神仙DP,这种题考试的时候真的想不出来,DP定义也是个困难。吸取一下skyh的讲题的思路。当我们发现顺着题目说的来构造模型不好构造的话,可以换个方向。就这道题,我们确定一个根节点来向下扩展,发现我们需要知道的信息太多,数组根本不能维护,状压$bitset$会炸内存,那我们可以考虑逆向来,给多颗树加上一个公共根节点形成一颗大树,这应该也是这道题的突破点。逆向思维还是挺重要的。
模拟81
T1 状压定义,不能只局限与普通的定义,要根据题目性质来定义DP,对于不同的限制要考虑全面,算好空间复杂度和时间复杂度,稍微超一点也没关系的嘛,只要卡的不死是可以过掉的。DP的定义可以多几维。
咕了好几天今天补一补
最近对于基础的算法、技巧运用有点不熟练啊,脑子一定要动起来,不要局限思维,离散化,排序,桶这些简单的算法不能想不到啊,这些还是要印在脑子里的啊。
模拟 88
T2 巨模拟,还有dp的定义,模拟需要耐心,细节要好好考虑,尽量减少复制粘贴,但是模拟一定要稳住,只能拿暴力的话,就不要去奢求正解,不要高估自己。
T3 自己对于搜索还是不理解。记忆化最重要的就是对与合法状态个数的判定。Hash表内存的东西越多效率越低,而在存不超过两个限制状态时效率还是非常高的。一些状压题可以记忆化,如88 T3,4进制压位可以搞到75pts,复杂度的不对的,不过对于考试来说,思路并不是很难想,实现起来也是一个Hash表,性价比不错的。不过这道题最好的思路还是将状态进一步压缩,压缩到复杂度可以接受的范围,然后就可以开心的记搜了。
模拟 90
T2 状压的定义还是关键。数据范围小首选搜索状压(不过状态数很小的还是上文的记搜吧),这题的状态定义非常好,主要的是用某些特定的点设为1,来维护特定的性质。对于1的设置需要好好考虑,常见的套路是“选or不选”,然而我们不应仅仅局限于此,就像dp定义一样,状压定义也要放开了思路,大胆想状态,不要害怕预处理,而关键总是预处理搞的很懵,在考虑状压或是考虑任何时,预处理都很重要,dp的预处理数组是很常见的一种,根据需要定义预处理,不要认为没有已知就“不可做”,没有条件创造条件也要做。
模拟 91
T1 考虑复杂度的局限,考虑最坏情况。这道题复杂度的局限就在于查询,写出柿子后发现这实在无法线段树维护,那就要另辟蹊径,考虑复杂度在什么时候是最差,最差能到多少,我们只考虑有用的、合法的情况,除去多余的枚举,可以大大降低复杂度。
T3 对于题目中所给的公式,要对每个变量进行分析,分析它何时最大,何时最小,是否单调,是否可以分治。对单调性要敏感,要努力发现单调性质去转化问题解题。
改完这题了,一个很重要的思想——链表。链表可以节省大量的遍历时间,数组链表方便查询,指针链表方便插入,两种链表都要熟练掌握。对于这道题的链表用法均可,因题而异嘛。这道题的链表其实是暴力优化,发现的很重要的性质就是多余状态有很多,也就是说,合法的取值只有log个,所以用链表就很方便了,加上二分,时间复杂度完全可以接受。
这是对链表的一些感想,其实最主要、最具体的还是对于该题目的分析。就想上面说的,分析单调性(算是一个小套路),分析多余状态,分析最大值最小值,分析题目中的性质是解题的关键。
模拟 92
T1 可恶的ex_gcd。每次做扩欧都是重新学一遍,这次又是在考场上推,但是没推出来。这次终于稍懂了一点。毕竟ex_gcd是一个联赛基础的数学知识,好好理解才能随机应变。主要的用法就是用来求解xa+yb=c的特解,还有就是在lcm上的用法,还是很重要的一种算法。
T2 主要难点就是排序了,做了很多题,发现排序很重要,怎么排序很重要,排序思想千变,与顺序无关可以排序,排序后使问题变单一普遍,求解方法更简单,降低复杂度可以排序(莫队分块奇偶性排序),可以用来使某一端有序查找另一端合法答案(线段树优化),随机化排序,主要的还是前几种怎么排序。排序思想不能僵化,大不了大胆一次嘛。
T3 用中间点求解最优的思想。类似于折半搜索,不过这题是最短路的算法,折半、贪心思想。当图的类型不适合高效算法求解时,可以考虑用中间值更新两个端点的答案。很多题都是类似的思想啊,之前有一道折半搜索的状压,还有并查集维护最长链,思想还是挺相似的。
模拟 93
这场考试整体状态还是不错的,思考的比较充分,但是还是有一点走神的情况,下次尽力做到更专心。
T1 题目挺裸的,主要是锻炼了一下快速思考。前缀和是一个常见套路了,区间贡献转化为点间关系。前缀和和差分差不多兄弟一样,考虑区间贡献的时候可以优先考虑这两个(通常区间和,区间异或常见)。然后就是一个二维偏序的模板了。注意思考的时候要全面,尤其要考虑好边界问题,有的时候题目思路看似清晰,但是只要一涉及到边界问题,问题就变得很复杂。这道题的边界还是比较显然的,就是树状数组的下界0和上界n+1,在其他题目中也要把边界条件判断清楚。当然这道题也可以CDQ分治,$O(nlog^2n)$,也可以接受,不过能用二维偏序就二维吧,毕竟好做一点。
T2 Dp思路不错的,打这题的时候也是比较大胆了。最大的收获就是先从最暴力的方法入手,搜索不行就果断放弃,大不了直接打DP,即使DP也只能拿搜索分。然后是优化思路。DP时动手写一写柿子,适当的转化一下柿子,需要的枚举的未知量越少越好。差不多就是一个逆向思维(之前也提到过了)。如果我不知道深度没办法做的话,那我可以反着来,根据柿子推导深度。可能说的有点前言不搭后语……其实就是想法要多变,反(双)向考虑问题在解题中会更有优势。最后就是有关AC的优化了。这一点在考试的时候可以打表找出来,不要放过任何一个发现规律的机会。这道题我们会发现那个中间点枚举的很诡异,不妨就从中间点开始入手。打表就可以轻松发现它的规律了,证明也不是很困难。这是一个小技巧,不过很有用。学会做题,学会找出问题关键,学会发现bug,每个题都会有突破口。稳住心态,不着急,慢慢来,想清楚。
模拟 96
这场考试状态挺差的,本来很想调整回来,可是还是没救回来。
T1 一开始没看出来高精,考试结束前5分钟看出来了,但是已经晚了,正解慢速乘,思想跟快速幂差不多。比较实用,但范围好像不是很广。
T2 没看清题,复杂度分析的问题。有时候答案的上界非常松,复杂度要好好分析,不要一味考虑最坏复杂度,有时候所谓的最坏复杂度不会出现,要想清楚,敢想敢打。
果然WC太菜了,总是往下duangduang摔。
模拟 99
T2 题干长的一般都是大模拟。。贪心思想要好好证明,找规律,对于合法与否一定要考虑清楚,抓准什么可以贪心,什么不可以,贪心与决策单调性有很大区别,考虑是贪心还是单调,好好考虑不要混淆。
T3 有时候rand很强,不要小看rand,这题就是rand的好题,乱搞就可以了。正解思路比较难想难证明,适时放弃正解选择乱搞,能骗到不少的分数,尤其实在某些结论题上,或是说在某些有结论但是看不出来或者是难以证明的。有时候rand的正确性也是可以证明一下的。
模拟 100
T1 模板不熟练。剩下个位数天了,这些板子要好好打,主要还是理解板子,拥有现场推导的能力。欧拉路自己确实还啥都不会呢,这是一个知识点需要整理一下。
T2 不要放过任何一个骗拿分的机会。不要吝惜时间去优化,尽管复杂度仍然不对,尽管可能拿不到满分,但是不能放弃,要找性质,看测试数据。明知道自己的程序跑的慢,那你还不去优化,这不是傻么。不要扔掉任何能得分的机会,把握住机会。
模拟 102
觉得每次考一套卷都会有巨多收获。。可能还是自己太菜了见得太少了。。加油吧。
T1 要找准性质。搞环上的贡献拆成两倍长度的串是常见套路了,当我们需要处理跨特殊点的贡献的时候,要想想能不能排除跨越的贡献,使它简单。有时候边界问题能调死人,但是将边界问题简化甚至消除,会降低很多的调试时间。这道题就用到了单调栈,我们扫二倍串的时候可能会作出重复贡献,实际上就是边界的问题,我们考虑消除这一部分重复,那么我们可以规定起点为最大值,那么跨越最大值的贡献就会省略,只需要计算成环的贡献就好了。
T2 还是DP啊。状态定义是一个大问题……突然词穷……这题为啥我在考场上没做出来啊?!线性DP不会做???定义一定要清楚,在设计转移的时候要好好考虑“我这样DP会不会算重(漏)”“它会不会包含到我之前考虑受限的情况”,DP时候要多问自己几个问题,好好想想。
模拟 104
T2 乱搞。玄学AC法。不够时间了试试骗分,要大胆骗分,会骗分。
模拟 105
T2 我的妈啊我觉得我真的是傻到爆了。并查集竟然能写错。fa[v]=fa[u]我也是没谁了。这种低错直接从AC->WA0啊,自警这种低错一定要避免啊,简单题爆炸这谁抗的住啊!!!
模拟 111
T2 低错要避免,变量名要记清楚。