[2025.6.29-7.1]训练记录
- string, digit and DP.
马上放暑假了,该写写这种东西了/yiw。
关于数位dp
尝试理解cdx发的好看 数位dp 板子:
int dfs(int len, ..., int lim) {
if(len == 0) return ;
if(~f[]) return f[];
int ret = 0; for(int i = 0; i <= x; i ++) {
ret += dfs(len - 1, ..., lim | (i < a[len]));
}f[] = ret;
return ret;
}
尝试默写了一遍,其实是观看qaqfj5的高手板子之后总结的感觉最容易理解的写法。
大概理解之后我觉得这其实就是搜索加个限制条件再加记忆化,但是确实把状态数压下来了。好像非常牛逼。
那这个板子就可以很快的处理一个范围内在数位上满足什么什么条件的方案数之类的问题了。
如果要求和的话大概是这样:
PP dfs() {
if(!len) return {};
...
for() {
ret1 += dfs().x;
ret2 += dfs().y + (i * ...) * dfs().x;
}return {ret1, ret2};
}
pair里面第一维是方案数,第二维是和。当前值统计贡献要乘一个方案数。
使用各种区间转前缀,二维前缀和之类的技巧,就可以转化各种板题,好像非常厉害。
还有几句箴言留给之后看,比如看到相邻位置交换的情况时如果要找规律可以考虑异或(?)
关于string
字典序的题好像长的都很贪心,有道dp非常难写的题居然很简单的贪了。
- COCI 2023/2024 #2
场切了四题,信心赛确信。
T1T2 是简单爆搜,T3 防ak。
T4 只要想到区间dp就无难度。
T5 是一个阴间计数。
考虑区间内岛屿数量怎么记。
发现如果定义“峰”和“谷”的话,设 \(cnt1\) 为被淹没的“峰”数量,cnt2$ 为被淹没的“谷”数量。
区间内岛屿数量就是 \(1 + cnt2 - cnt1\)。
这个定义其实比较奇怪,基本满足:
当 \(a[i] > a[i - 1] && a[i] > a[i + 1]\),\(i\) 这个位置是“峰”。
同理当 \(a[i] < a[i - 1] && a[i] < a[i + 1]\), \(i\) 是“谷”。
大概就是单调性的转折点。
于是统计区间内比水位线低的峰谷数量即可。
但是区间的左右两端要特别算。所以感觉这里比较智慧了,其他人好像都不是这么做的?
在场上询问大神 “区间限制算一维偏序还是二维偏序”。
本来已经打算猛写cdq了,结果被金口玉言 “前缀相减” 悬崖勒马。遂使用树状数组拿下。
- COCI 2023/2024 #1
T1T2 仍然信心。
T3 想了很久发现做两轮单调队列就可以了。得益于前一场的C有单调队列吧。
总之以后遇到单遍的区间最值要想起来。算是复习不太熟的知识点了。
感觉之前没用过几次单调队列。记得的好像只有一个岛屿,基环树上dp使用了单调队列。
T4 是很厉害的数论计数。
T5 防ak了。
接下来就要一直停课了(大概),中考貌似考的还可以,但是有点怕高中内容会落下。
高一(现在好像算高二)的前辈说有时候要去找老师单独补。那也是高一下半的事情了。
目前最近的目标大概就是 NOIP 了,希望是 OI 生涯最后一次长期停课。
夏天才开始吧。