【题解】牛客OI周赛8-提高组
A-用水填坑
10分
边界不能存水, 那么一共有个位置能存水.
枚举每个位置放多少水, 判断是否合法然后取最优方案.最多有种情况.
20分
不存在两个连续的块能存水, 那么只需要在10分的基础上枚举每个块和它四周的块能不能同时存水就好了.
95分
大概是发现每一层都是独立的, 因为高度不超过100, 所以将其分为若干高度为1的层, 每层独立处理, 看看每一层能存多少水, 再累加起来就好了.可以直接搜索.复杂度不超过.
100分
这大概是个贪心的做法.
一开始所有未在边界点的最终高度都是不确定的.策略是用已经确定了高度的最低的点来更新其它未确定点的高度, 如果它相邻的点比这个点高度低, 显然可以填到一样高, 因为这样做能保证这个被更新的点一定是被它相邻的高度最低的已确定高度的点更新到.
那么用堆来维护最低的确定高度的点, 一开始堆内只有边界上的点.
每个点只能进一次堆被更新一次高度.复杂度.
这个题总体来说比较简单, 95分可以说是非常容易拿到的.
B-死宅选点
设表示, 那么若点u与点v的路径上有条边, 这条路径的厌恶度就是.
30分
假设选择一个位于中点左边的点, 这个点左边有个点, 右边有个点.则***生的厌恶度为.
注意到如果选择右边的那个点作为答案, 厌恶度变为.发现厌恶度变小了.因此可以推断, 选择更靠右的点(不超过中点)是更优的.同理, 选择右边的点也是如此.因此, 当图为链的形态时, 选择中点是最优的.
50分
, 可以以每个点为树根遍历一遍树, 得到每个点作为根时的厌恶度进行比较.
因为树是随机生成的, 利用随机生成的树期望最高树高为, 平均树高为, , 那么产生的最长路径长度大概在以内\footnote{数据中有两个点最长路径长度达到了63, 但真的是随机数据, 嘻嘻!}, 所以答案是可以用一个128位长整数(C++中的\li\li int128)表示的, 用long long(\li int64)分数会少一点吧.
70分
, 因为1的任意次幂都为1, 所以一条路径的厌恶度就是路径上边的个数.
设为到其它所有点的厌恶度总和.容易得到
其中表示这棵子树的大小.
随便选一个点作为树根, 遍历一遍树就得到了树根的答案.然后再遍历一遍树, 得到其它点的答案.
100分
发现难点在于没法对直接进行运算.首先可以看成是一个公比为首项为的等比级数.类比的常识再应用等比数列求和公式.我们可以得到.
因为分子上的和分母上的是每一项都有的, 本题也无需求出具体的值.因此可以认为与相等.
设表示树上与距离点的个数.
表示的子树中与距离为的点的个数, 表示不在的子树中与距离为的点的个数.
那么$$
那么点与其它点的总厌恶度就是.
其实可以将看成是一个进制数第位上的一个"1".模拟进位, 即, 当然到最后一位就不用再进位了.
那么这样比较两个进制数的大小最多需要最大路径长度次().加上前面求的复杂度大概是.总复杂度为.
C-随机采矿
10分
.注意到在为任意可能值时都为1.所以第个时刻一定会制造一个SCV.以后就不会再制造了.
20分
, 又因为第一个SCV在第0时刻被制造.所以只需要考虑第二个在什么时候制造即可.
设第二个SCV被制造时刻的期望值为.
其实这个做法只是为您提供了一个可能的思路.
50分1
这个做法不是我想的(另一位), 设到第个时间(第个时刻到第个时刻)有只工作的(不算正在制造的)SCV的期望收益, 逆推得到:
然而这个做法我并没有想到如何优化到更高的分数.
50分2
设表示第时刻拥有只SCV的概率.那么
设为到时刻的期望收益(没减去制造SCV时间的收益)
减去制造SCV时间的收益
总复杂度为, 可以通过的数据.
100分
发现每次转移实质上都是一次线性变换.
可以把依次填入一个的矩阵中, 设为
特别的
就可以将依次转移表示成一次矩阵乘法了.
发现最多有种值, 即有中可能.
那么进行数论分块.对于的一个可能的值求出当这时的转移矩阵.矩阵快速幂即可.
首先为了方便, 将同样表示成矩阵乘法的结果的形式.
发现要求需先求出, 但是在求的时候并不是将所有的全部算出来的.
不过依然可以利用一点小技巧求出期望.
依然是利用之前的数论分块的结果.
如果的结果相同,设此时的转移矩阵为, 那么
发现这是一个矩阵等比级数的形式.一般有两种求等比级数的方法:
-
等比数列求和公式: 有除法, 需要用到逆矩阵, 可能不存在逆矩阵(广义逆矩阵可能可以?), 不建议用;
-
分治: , 根据的奇偶性进行讨论.复杂度是.