【题解】2021牛客OI赛前集训营-提高组(第一场)
A.
最优方案中 a n s [ i ] [ j ] ≤ 17 ans[i][j]\leq17 ans[i][j]≤17
所以只要把 ≤ 17 \leq17 ≤17 的边连起来就好了
单次 dijkstra \text{dijkstra} dijkstra 时间复杂度 O ( ( n + m ) log n ) O((n+m)\log n) O((n+m)logn) 。
这道题如果把堆去掉换成队列的话时间复杂度是 O ( 17 n 2 ) O(17n^2) O(17n2) 。
B.
考虑区间 dp 。
dp 转移非常显然。
但是你会被卡常数。
有一个结论:区间的第一次操作一定是区间最大值。
考虑怎么证明它:如果先操作 max ,再操作 x ,代价为 L + R + L1 + R1 ;如果先操作 x ,那么代价为 Max + R1 + L + L1 ,显然先操作最大值比较优。
根据 不等式传递性 ,我们每次交换操作序列中 Max 到左边会使答案更优,结论得证。(我们得到了本质上的最优策略 233)
加上这个剪枝,时间复杂度 O ( n 3 ) O(n^3) O(n3) 。(虽然复杂度没变 233)
C.
非常恶心的模拟题。
很容易看出来答案是若干个等差数列求和。
暴力枚举 i ∈ [ 2 t , 2 t + 1 ) i\in [2^t,2^{t+1}) i∈[2t,2t+1) ,首先不难推出 i ∗ ( c − 1 ) m o d 2 t + 1 = 0 i*(c-1)\mod 2^{t+1} = 0 i∗(c−1)mod2t+1=0
把 c − 1 c-1 c−1 进行 2 2 2 的因数分解,即: i m o d 2 g = 0 i\mod 2^{g}=0 imod2g=0 ,其中 g = max ( 0 , t + 1 − p ) g=\max(0,t+1-p) g=max(0,t+1−p)
这里不难看出两件事:
- 每 2 g 2^g 2g 个数的函数值相同,一共有 2 t 2^t 2t 个数,所以有 2 g − t 2^{g-t} 2g−t 组,而每一组之间的公差为 2 g 2^g 2g
- 如果 i < n − 1 i<n-1 i<n−1 的话这个组可以恰好分完
我们回顾一下等差数列求和公式:首项 * 项数 + 项数 * (项数-1) /2 * 公差
带入上式可以得到答案。
现在我们来解决 i = n − 1 i=n-1 i=n−1 的情况。
我们分为散块和整块。
散块比较简单,只要能整除 2 g 2^g 2g 部分的都是整块(换句话说 1 + 前 2~n-g 位)
后面 n-g+1~n 位就都是散块了。由于我们把最后这部分散块看成了整块,所以多算了 2 g 2^g 2g - sk - 1 个数 ,末项又可以用 首项 + (项数-1) * 公差 来求得,所以我们就做完了。时间复杂度是 O(n) 的。
总结:这道题纯用了数学方法来推导,每一个部分的求和都特别清晰,必须对题目性质有较深刻的认识才能做得出来。
D.
二维 st 表 + bitset + 二分。
做法很显然就不说了。主要是观察到 a [ i ] [ j ] ≤ 100 a[i][j]\leq100 a[i][j]≤100 所以直接上 bitset \text{bitset} bitset (真可谓暴力神器)
时间复杂度 O ( n 2 l o g n ) O(n^2logn) O(n2logn) 。(可能常数略大 233)
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530228.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」