2021牛客OI赛前集训营-提高组(第四场)总结

概述

预估得分:100+100+30+50=280

实际得分:30+50+30+45=165

T1 最终测试

题目大意

n 名选手,第 i 名选手的得分有 0,ai,0,ai,1,ai,0+ai,1 四种等可能的情况,求每名选手的排名期望。

解题思路

考虑期望的线性关系,若第 i 名选手成绩为 x,会对成绩在成绩 [0,x) 范围内的选手有 1 的贡献。而每个人有四种成绩(注意,不一定不同),每一种的概率都是 0.25,所以对其中一种成绩 x,对成绩在区间中 [0,x) 的选手有 0.25 的贡献。最后枚举每一个人,减去自己的贡献后,用对应成绩的概率乘上对应成绩所受到的贡献再把四个成绩的答案加起来就得到分数高于当前选手人数的期望 E,而 E+1 就是我们的答案。

具体实现可以使用线段树或树状数组等支持区间修改单点查询的数据结构。

T2 空间跳跃

题目描述

有一个整数 n,希望通过一系列的变成 1 并输出方案。每一次的变化是以下三种之一:

  1. n|2,将 n 变成 n/2

  2. n 变为 n×3+1

  3. min(|n|,|n+d|)l,将 n 变为 n+d

变化次数不得多于 1500 次。

解题思路

80pts

直接启发式搜索,以 |x1| 为启发值(x 为当前值)。

至于考场为什么只有 50pts:看错第三种变化的条件了,看成 max(|n|,|n+d|)l 了。

100pts

分类讨论:

  1. n>0

    不难发现,这种情况就是角古猜想。直接跑就好。

  2. n0

    这种情况比较特殊,因为如果还用上面情况的方法可能会死循环。

    考虑如何将其变为正数。可以先按照情况 1 的做法去做,而一旦 n 的当前值的绝对值小于等于 l,就可以一直加 d 直到其大于 0

    然而这样可能会超过 1500 次。打表发现,其实可以一直跑直到 |n|100 再一直加 d

T3 快速访问

题目大意

给定一棵以 0 为根的树,求点集 j|max(ik,1)j<i0 中所有点到 i 的距离的平方和

解题思路

30pts

O(n2) 枚举加上 O(nlogn) 倍增求 lca,暴力可过。

100pts

在写

T4 门童

题目大意

完全不知道怎么抽象出形式化题意。

解题思路

50pts

首先有一个小贪心,先到达的选手一定会先接待。所以按照 ti 排序。

dpi,j 表示已经接待完了前 i 个人,最后一个人是在 j 时刻接待的。

则有转移:

dpi,j=maxti1kmin(ti1+pi1,j){dpi1,kx00×(jk)+fi×(ti+pij),[jkl×2]×dpi1,k+fi×(ti+pij+(jkl×2) timesx11(x01+x10)×l}

其中 [x] 的值当且仅当表达式 x 为真时为 1,否则为 0

时间复杂度 O(n2T),其中 Tmax1in{ti+pi}

发现可以使用单调队列以及前缀最大值优化,优化后时间复杂度为 O(nT)


__EOF__

本文作者NightTide
本文链接https://www.cnblogs.com/NightTide/p/16919273.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Night_Tide  阅读(125)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示