给国与地震
一种暴力的想法就是将所有当前可以合并的边扔到优先队列里面,每次取出来堆顶合并,然后扫描这条边两端点所在联通块当前没有被合并的所有出边,如果能合并就合并
看起来每次合并就把所有出边都扫描一遍非常亏,所以可以给每条边权为 w 的边设置一个 w−au−av2 的阀值
那么只访问阀值小于增量的边并更新阀值为 w−sumu−sumv的一半即可,这里 sumu 表示 u 所在联通块 a 的和
实现时,对于边 (u,v) 如果在 u 这端改变阀值,可以不在 v 的记录出边的数据结构中删除具有原来阀值的边的信息,因为它会被较后处理到
当然在将边的信息插入数据结构的时候需要让阀值加上当前联通块 sum
给国与时光机
设 A 表示两端都被正常经过的点,L/R 表示 左/右 边被正常经过的点,N 表示两端都没有被经过的点,那么 N 之间可以任意配对
显然 A 会和 A 连边,那么 A 是奇数的时候无解;
在 m=2n+1 的档中发现让 A 每 4 个一组进行 13,24 配对就能遍历所有边,m≤2n 时也尝试如法炮制
让每个 L 找到在其后面最靠左的 R 配对,如果 A 的数量是 4 的倍数那么所有元素都被配对了,得到答案
否则如果存在 ALR...A...LR
的结构(点表示省略了若干个 A),让内侧 RL 配对,外侧 LR 配对,选择两对夹着的一个 A 以及外面的一个 A 凑成一组四个
此时将 A 的数量又变成了 4 的倍数,使用上面的方法处理即可
给国与赌场
策略是将 a1b1 写成二进制小数,每次选择最后一位 1 下注,这样也保证了递增
那么在小数位数有限时可以设 fi 表示小数点后第 i 位向前进位的概率,答案是 f1
如果第 i 位是 1 那么概率就是 fi+1+p(1−fi+1);反之则为 pfi+1
这个递推显然可以写成一次函数复合的形式,那么对于小数位数无限的情况就先处理出来循环部分无限次复合的结果再和不循环的部分复合,一次函数复合无限次的结果是 +∞∑i=0bki=b1−k
关于将分数变成小数可以模拟除法竖式,x 下一个出现的是 2x−b1 或者 2x ,取决于 2x≥b1 与否
附上题解中关于这个策略的证明
设 f(x,n) 表示从 x 赢到 2n 的概率,此时下注只能是整数,设 c(i) 表示 i 的二进制表示中 1 的数量,q=1−p,那么递推式为:
f(x,n)=qf(⌊x2⌋,n−1)+pf(⌈x2⌉,n−1)=x−1∑i=0qc(i)pn−c(i)
这可以通过归纳得到,具体而言:
f(x,n)=qf(⌊x2⌋,n−1)+pf(⌈x2⌉,n−1)=⌊x2⌋−1∑i=0pn−1−c(i)qc(i+1)+⌈x2⌉−1∑i=0pn−c(i)qc(i)=⌊x2⌋−1∑i=0pn−c(2i+1)qc(2i+1)+⌈x2⌉−1∑i=0pn−c(2i)qc(2i)
2i 作为原和式中的偶数,2i+1 作为原和式中的奇数
现在需要证明 ∀0<k≤x, pf(x+k,n)+qf(x−k,n)≤qf(⌊x2⌋,n−1)+pf(⌈x2⌉,n−1)=f(x) ,也就是说没有任何一种其它在第一步下注的选择比按照上述策略优
先假定做完第一步之后采取上面说的策略更优,现在证明第一步中也执行这样的选择是最优的,那么将 f(x±k,n) 展开,简单和式变换可以得到
pf(x+k,n)−pf(x,n)≤qf(x)−qf(x−k,n)k−1∑i=0pn−c(x+i)+1qc(x+i)≤k−1∑i=0pn−c(i+x−k)q1+c(i+x−k)
此时如果能找到一个 [x,x+k−1]→[x−k,x−1] 的双射 F 使得对位满足小于关系,也就是说满足 pc(i)−c(F(i))−1≥qc(i)−c(F(i))−1
由于 p≤q 那么 c(i)≤c(F(i))+1 ,注意到任意 x,p 都有 c(x)≤c(x−2p)+1 所以直接找到 k 在二进制表示下的最高位 b ,让 y∈[x+k−2b,x+k−1] 的 F(y)=y−2b 然后迭代即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律