【题解】牛客练习赛46

A:华华教奕奕写几何

设大半圆半径为r,两个小半圆的半径为r1,r2。

则有:2*s=π*(r*r-r1*r1-r2*r2) ①

r=r1+r2 ②

两式联立得r=r1+s/(π*r1)

可以把r1看作自变量,r看作因变量,对r1求导,即可得r的最小值。


B:华华送奕奕小礼物

设sum_a为a的前缀和,sum_b为b的前缀和。则以(x1,y1)为左上角,以(x2,y2)为右下角的矩阵的权值为(sum_a[x2]-sum_a[x1-1])*(sum_b[y2]-sum_b[y1-1]),其中要满足x1<=x2,y1<=y2。x1,x2的选择与y1,y2的选择相互独立。可以预处理所有y1,y2的组合,然后排序。接下来枚举x1,x2,对y二分即可。复杂度n^2*log(m^2)


C:华华跟奕奕玩游戏

设a[i]为进行了i轮游戏黑球个数的期望,则a[0]=n。

a[i+1]=

化简后得a[i+1]=,到这里可以直接矩阵快速幂求解。也可以继续推到。令s=,则

a[0]=n

a[1]=s*n+p*s=n*s+p*s

a[2]=s*a[1]+p*s=n*s^2+p*s^2+p*s

a[3]=s*a[2]+p*s=n*s^3+p*s^3+p*s^2+p*s

不难得出a[k]=n*s^k+p*(s^1+s^2+...+s^k)


D:华华陪奕奕打怪兽

二分时间。后面贪心的选择攻击策略。对于二分出来的时间t,因为a是循环数组,对于每个i,1<=i<=n,可以算出最大的整数d,使得i+d*n<=t,实际上可以看作a[i]*b[j]可以使用d次。可以把所有的a[i]*b[1]存在一个优先队列,每次取最小,次数用光后在放入a[i]*b[2],知道C或W小于等于0。

若某一时刻a球比b球速度快,则a球始终比b球速度快。取T=300000。对于1操作 v1,t1,m1。可以算出V1=v1+g*(T-t1)。对于2操作,可以算出V2=v2+g*(T-t2)。则需要查询的小球即是满足V1<=V2的小球。然后根据公式m1*(v1+g*(t2-t1))^2,拆开,维护6个树状数组即可。

F:华华和奕奕的旅行

考虑若没有1操作,对于2操作,若当前节点的水量不足,可以找父亲节点借水,若父亲节点处的水不够用,则找父亲的父亲,以此类推,直到水借够为止。经过这次操作后,这条路径上的水已经被借完了,所以这个点的子节点借水到这个点时,可以直接跳过这段路径。可以用并查集维护一下。对于每次1操作,可以重构一次树。
最后膜一发Tweetuzki,标程被打爆了。



全部评论
我想稍微介绍一下 F 题的动态 DP 做法,在这种做法下,opt = 1 的次数不多于 500 次的条件可以删除。 首先设 。 对于没有修改的答案,可以很容易想到树形 DP。用 表示 u 号点最多余多少水,那么有以下递推式成立: (当 u 为叶子节点) (其它情况) 然后用动态 DP 维护这玩意儿,就是多开一个 ,其中 v 是 u 的轻儿子。然后第二个方程可以转化为: 接着大力推一波,发现需要对于每个节点维护一个矩阵 ,然后转移矩阵大概长成这样: 然后抄一下动态 DP 模板,树剖套线段树维护一下矩阵转移就好了。
点赞 回复 分享
发布于 2019-05-17 22:32
E题似乎维护3个树状数组就够了对于单个小球\ \ 对于所有小球\ 所以只需要维护就可以\ 但是这么做除了节省空间似乎并没有太大的作用2333
点赞 回复 分享
发布于 2019-05-17 23:29
E题写线段树看起来会得到一个痛苦的超时。。 https://ac.nowcoder.com/acm/contest/view-submission?submissionId=40689502&returnHomeType=1&uid=3772487 做法是很傻的按照最终速度离散化对球进行排序,那么对于询问Q,只需要找到segId[Q],查询1~segId[Q]这个区间的球的动能,维护六个线段树。。 也可能是我写的太挫啦。。
点赞 回复 分享
发布于 2019-05-18 14:27
昨晚一开始看到 F 题以为是书剖或者动态树曾一度扔了。。。 后来发现数据范围和 5s 就想到了 op1 暴力,op2 路径压缩的做法,这样总时间复杂度应该是。 其实这里还有不少的优化,比如:预处理逆 BFS 序后暴力键树可以变成非递归线性;增加可以负流量的虚根 0 ,这样只需要判断 0 是否负流量;并查集操作只需要调整 find 函数,代码也很好写,然后对于已经 0 处负流量的 op2 直接跳过剪枝。 路径压缩的卡法我一直没找到,随即数据是的,所以这题基本可以当作的做法。好像只需要建树的非递归优化就能把速度挤进 1s 。
点赞 回复 分享
发布于 2019-05-18 08:33

相关推荐

DKS233:项目写太简单了,你用什么技术实现了什么功能,优化了多少,分了哪些模块,解决了哪些难点,最好分模块写,你写的太模糊了。精通还是少用吧,你确定问你底层你扛的住吗,最好用熟悉。具备良好**意识,这种空话不要写,技能层面,要写就写实在的,比如“熟悉常用数据结构,如,堆,栈,链表,哈希表,平衡树”这种
你的简历改到第几版了
点赞 评论 收藏
分享
评论
10
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务