分享|2023 年度报告
2516
2023.12.26
2023.12.26
发布于 未知归属地

年初开始还是照例写写hard,然后猛然发现LCCUP春季赛可以送几天会员,于是就趁机把之前没法看的会员hard都写完了。hard基本清空后没啥好写的,比赛也是一等一周,3月就去注册atcoder和codeforces,然后立刻被Java龟速的输入输出按在地上摩擦,结果就是现在哪怕一行代码都不写,我这个只处理输入输出的Main.java都有2797个字节。然后一边参加了一些三个平台的比赛,一边写了一些模板,感觉最常用的有这几个:Binseg(Binary Index Tree)、Bigmod(基于mod的大数)、Prime(素数和因数分解)、树的基本操作、Diset(并查集)、Binary Lift、CntMap(类似C++中的multiset)、Trie(Binary/Dict)。然后就顺势把leetcode那个写函数的套壳Main模板也统一到文件输入的壳上,好在今年也不怎么出需要自定义ListNode、TreeNode类作为输入类型的题了,输入都现代化的友好起来。比赛成绩偶有高低,不过rating起伏不算大,lc就2500上下,cf就1900上下。手速是拉满,Java代码会长一点,但主要还是脑子不够用,常常想的不周到、不准确、不对路子,好在心态比较好,就无论如何都积极面对比赛。由于比赛中遇到的有些(对我来说的)难题,死磕其实效率比较低,所以除了比赛,9月开始筛选cf上1600-2000的题目来写,不需要用到很难的算法,感觉对自己的提高比较有效率。到年底完成了110多道,不过这列表里还有将近2000题,也不知道写完这2000题和rating上2000哪个能先到达。

过去这一年里,印象最深的一题:ARC160D,像题目一样,如果打过麻将,会觉得题面简洁到不行。但是哪怕是赛后看了题解,也断断续续弄了一周才写好,期间学习了负幂的二项式定理,已经忘光的母函数,然后在纸上推导公式几大页,汗流浃背。被TLE折磨的一些后遗症:把所有能换掉的容器类都换了,什么ArrayList、HashSet之类的,如果需要动态长度的数组,可以使用SimpleList(满了就复制一下double一下length),如果需要值域不太大的Set,可以使用SimpleSet(数组记录值和位置)。永远不要在简单类型一维数组上直接使用Arrays.sort,请自动替换为ruffleSort。gcd改成非递归。有些题目会需要维护一些数中最大(或最小)的几个,于是实现了一个很傻但是有趣的类:FixedMax,保持一个固定最大长度的最大值列表,功能类似一个堆或者优先队列,但是当这个最大长度很小(如3)时,数组会更快,用起来也很方便。

因为也没有系统的正向学习,都是遇到啥题写写啥,不会但不是太难的就学一下,所以还实现了一些很不常用的模板:重复数字很多的优化的求和dp,套BitSet使用。求三角形外心。图的dfs生成树。树的质心分解。functional graph里找环。判断图是不是二分图。求树上每个点距离最远的点。树上一系列点对的最近公共祖先(LCA)查询。容斥原理(PIE)求gcd相关计数。manacher算法求字符串中所有回文子串。另外,还有一些没法变成模板的方法和结论:莫队。树dp中HLD降内存。gcd交换结合率。grid四方向扩散可以坐标变换45度后变成矩形处理。多维数组dp把大的维度放后面更快([n][n][2]对比[2][n][n])。a^b=c^d则a^d=c^b。长度n的字符串中的不同回文子串最多n个。Nim,Sprague Grundy theory。Xor hashing。别读错题。

23年写了1100+道题,大半都是水题,不过写了一些cf的题后,觉得思路打开了很多,颇有收获。希望来年提高些效率,减少点马虎,享受智力挑战的乐趣,预防老年痴呆。至于rating,强求不得,随缘就好。

null

评论 (16)