寒假有很多活要干的样子,但是想做题了(?flag
是寒假结束前上青,下个学期(或者有生之年QAQ)上个蓝
写篇文章记录一下写题,主要用来提醒自己有哪些重要的trick
,以及学习一些进阶的算法避免下学期挂了豆哥的课(没错。。作大死()
01.22
F. Firefly’s Queries
前缀和plus,假设最后直接形成的大前缀和数组是f
,l
到r
的区间和等于f[r] - f[l]
,求f[x]
可以分成r/n
个完整数组(和为s
),以及一段不完整数组
不完整数组的第一位是((r/n)%n) + 1
,长度是r%n
想到的一个方便的求法是倍增原数组,然后求这个二倍长数组的前缀和prefix
,这样的话这个不完整数组的区间和就是prefix[(x//n) % n + 1 + x%n - 1] - prefix[(x//n) % n]
D. Kousuke’s Assignment
感觉是很熟悉很常见的套路,但是没反应过来QAQ
01.29
玩了一周(霍格沃兹之遗真好玩!(不是)),正式回来学习
打算跟着白书,按照图论、数论、dp、数据结构的顺序过一遍,把书上的洛谷习题用C++敲一遍(C++水平真的太菜了(悲))
先从拓扑排序开始
今天先做了P1113和P4017练手,发现容易弄反出入度QAQ,以及忘了long long
查了半天
01.30
P1347
采用了每次输入都跑一遍拓扑排序的做法,但是犯了没有判断重边的错误被deepseek薄纱了,另外它非常有创造力地给出了每次判断队伍长度是否为1以确认是否还存在不确定关系的点的做法,感觉非常巧妙,我后来的理解是比如说有形如A<B,A<C这种关系在,去掉A之后B,C都满足条件,或者说“某一层有不止一个点”,所以不行
题解里还有一个最长路的做法也很好,主要是注意到了以下三点:
- 如果能走出来长度为n+2的最长路,证明使用目前为止给的k条关系(边)就能得到所有点的完整序列
- 如果在统计最长路时路径长度已经超过了n+2,那么肯定是到目前给的关系(边)中一定有环路的存在(想不明白?细品!一个完整序列怎么可能有重复的点?)
- 如果关系输入到最后,发现根本走不到终点,那么就证明无法得出整张序列