20241023 模拟赛(GCD,包含,前缀,移动)

看题戳这里

总结

20min 自习。
上来 30min 先把 t1 写了。
然后 t2 没看明白,先打了个暴力?然后发现值域很离谱,dfs就行了。
t3 t4看了一眼就跑路了。

解析

A. GCD

难度:黄
注意到只有当 \(n=\) 素数 \(p\) 的正整数次幂时,有 \(f(n)=p\)
其他情况都是 \(f(n)=1\)
所以用欧拉筛筛一遍的同时求答案就行了。

B. 包含

难度:黄
一开始脑子抽了,居然想到了 01trie。
然后发现值域只到 \(10^6\),所以暴力 \(dfs\) 预处理,然后 \(O(1)\) 查询就行了。

C. 前缀

难度:蓝
我们发现这玩意相当于一个序列自动机。
\(nxt[i][j][k]\) 为第 \(i\) 位上后面 \(2^k\) 个字符 \(j\) 的位置。
\(nxtlen[i][j][k]\) 为当前位置到后 \(2^k\) 个字符 \(j\) 的长度。
\(O(n\log n)\) 倍增预处理一下 \(nxt\)\(nxtlen\) 就行了。
然后对于带数字的,还要搞一个高精除低精,处理出商和余数。
注意若无余数,最后一轮是不能跑满的。

D. 移动

难度:蓝
机房大佬随手贪心成功拿到85pts。(数据真水啊)
考虑用最短路的思想。
首先把能通过闸门的时间段存起来标号(就是离散化啦),然后设 \(dp_i\) 为到达第 \(i\) 个时间段内的最快用时。
将(闸门的标号,时间段的标号,时间)放到一个结构体,然后每次向两边更新新的状态放到优先队列里,输出 \(dp_{id_{n+1}}\) 就行了。
具体看代码。

posted @   nagato__yuki  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示