CF1967C:Fenwick Tree 题解
CF1967C:
题意: 表示 a 数列的树状数组序列,已知 ,输入 k 和 b 数列,求 a 数列。
咕了好久才补的题,并不难,但是有一些启发性的知识可以分享。比赛时我发现树状数组的转移矩阵很稀疏,于是没想那么多就开始模拟矩阵乘,TLE了,后来仔细算了下发现是 的复杂度。
Solution:
树状数组是二叉树吗,显然不是。(但有些初学者误以为是二叉树,因为它名字叫二叉索引树)
我们画出两层树状数组来:
在单层树状数组中,每个方点的值维护的是儿子们的和。
反过来看,就是每个圆点的值会沿着线向祖先节点转移,并且它的值只会转移给最多 log 个祖先结点。
当单层树状数组变成了双层,我们依然可以画出这样的转移路径来,这时圆点到方点的每一条路径,都是数列 a 的贡献转移给 b 的方案。
上图中 转移到 的所有路径用绿色标出,可以看到有三条路径可以转移到 ,也就是说, 最终的值加了三次 。其他点也是如此,比如 加了一次 ,加了两次 。
路径数量就是 a 对 b 贡献的倍率,可以用组合数来求,纵向有 K 条线,横向有 log 条线。虽然 K 很大,但是从组合数公式入手,分子分母分别只有 log 项,暴力计算即可,复杂度 nlogn。
已知 a 计算 b 容易,反过来也不难。只需要让 减去 对它的贡献,得出 对 的贡献,这个贡献只有一次,就是 本身。
__EOF__

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具