20250722(二次修订)
总结
今天下午和晚上在打数据结构2,考试题回家改
预估240,实际总分170
A:100 B:0(挂了) C:70(n^2暴力) D:0(没来得及打)
A
预估:100, 实际:100
用单调栈求出每个点i右侧第一个较大点pos,可以发现这个点的贡献为rec[i] * (n - pos + 1),直接对贡献求和即可,但是这会漏掉右侧没有更大数的和左侧没有更小数的,要再加上每个点自己的单独贡献n * (n + 1) / 2
B
预估:70,实际:0
对于题目条件,可以简化出三个T“碰瓷”S的充分条件:
- s[l] == t[1];
- T为S子序列
- S“开头”长度<=T“开头”长度
前两个可以直接解决问题:从满足s[l]t[1]的l开始,向右找出第一个满足s[pos]t[2]的点,继续直到s[pos[m]]==t[m]
对于最后一个条件要进行对所有字符相同的特殊情况考虑
C
预估:70,实际:70 (O(n^2))
- 考场想法:对于一个长度为len的“旋律”,要满足对于l<=i<=r,a[i]==a[i+len]=a[i+len*2].....,那么我们可以再每次加入新字符时看每个长度是否符合,存在vis[n]中,每次统计前从上一次继承,不用改变或新开数组,答案为每个数都可以满足的长度数量,可以做到O(n^2)
- 正解:讲解中的做法是整体二分加速对某个长度是否合法的维护与统计加速,但是我认为bitset可以解决问题
D
预估:0,实际:0(纯粹就是忘打暴力了。。。)
- 回顾:考场应先打暴力,再考虑高分,这回痛失50pts。。。
- 正解:对于前缀和进行函数图像分析,发现合法的序列满足中间的图像都在开头和结尾图像之间
对于每次删掉一个-1,会使得总和+1,发现要删掉的-1个数最少是最大子段和=总和
统计前缀和的时候,每次遇到<0的情况就删-1,发现这并不会影响最大子段和,就按照这个操作继续就是一个完整的构造方法
接下来只要用线段树维护区间最大子段和,和总和即可
汇总:
- 要先把所有暴力先全部打完,再考虑正解
- 从暴力思路向正解思考时可以多考虑对题目条件的转化

浙公网安备 33010602011771号