当前位置: 首页 > news >正文

[ICPC 2022 Nanjing R] 工厂重现

[ICPC 2022 Nanjing R] 工厂重现 - 洛谷P14160

这个题应该是这个题的加强版,其实差不多。

标签 Minkowski, 平衡树

把一条路径拆到每条边的贡献,若 \(u\) 的子树内有 \(c\) 个黑点,\((u, fa_u)\) 的贡献是 \(c(k - c)\)

\(f_u(i)\) 表示 \(u\) 的子树内选取 \(i\) 个黑点的答案。

合并子树时,\(f_u(i) = \min \{ f_v(j) + wj(k - j) + f_u(i - j) \}(w 为 (u, fa_u) 边权)\)

\(g_v(j) = f_v(j) + wj(k - j)\),很显然是一个闵可夫斯基和的形式。

考虑 \(f, g\) 的差分数组,\(\Delta g_v(j) = \Delta f_v(j) - 2wj + (k + 1)w\)。这玩意怎么搞?

为了保证维护差分数组的从小到大排序的顺序(归并),同时加的东西与 \(j\) 相关,只能使用平衡树了,打个懒标记即可。

因为两棵树没有什么性质,还是要启发式合并,把 \(sz\) 小的那棵上的节点一个一个丢大 \(sz\) 大的。所以时间复杂度:\(O(n \log^2 n)\)

因为蒟蒻只会 FHQ,所以说说写 FHQ 的坑点(可能不太清楚,可以忽略):

  • split, Merge 时都需要下传懒标记,否则少了/多了一个儿子以后下传有 \(bug\)
  • 不妨设一次项、常数项的 \(tag\) 分别为 tagk, tagb。为了保证下传时的 \(j\) 还是原来的 \(j\)(因为经过 split, Merge 后的 \(sz\) 不太可靠),可以 update 时直接把 tagk * c 直接加入到 tagb ,而不是每次开一个 \(sum\) 记录当前节点前面还有几个节点。
void update(int c, int x, int k, ll s) {if (!x) return;s += 1ll * c * k, tr[x].val += s + 1ll * rnk(x) * k;tr[x].tagk += k, tr[x].tagb += s;
}
http://www.gsyq.cn/news/111889.html

相关文章:

  • Java新手做毕设:用雷池WAF护SpringBoot项目,避免演示时出洋相
  • Google Drive下载神器:gdrivedl使用完全指南
  • 第三讲:如何用 AI 快速生成可用应用——实战示例
  • LobeChat能否对接Asana项目管理?任务分配AI辅助
  • LeagueAkari智能游戏助手:5大核心功能全面解析与实战应用指南
  • 支付宝的“药柜”野心:从AQ到阿福,蚂蚁为何死磕医疗AI?
  • 怎么查看自己Ubuntu剩余空间有多少个G呢?
  • 微信多设备登录终极解决方案:WeChatPad平板模式完整指南
  • LobeChat镜像优势详解:为何它成开源大模型前端首选?
  • 纪念币预约神器:3步实现高效自动预约的终极指南
  • 网盘直链解析终极方案:彻底告别下载限制的完整指南
  • vue中的props详解
  • Google Drive高效下载终极指南:解锁无限下载潜力
  • LangChain构建智能文档分析系统的7个核心技术模块
  • NVIDIA TensorRT-LLM高性能推理框架解析
  • 纪念币预约自动化终极指南:高效提升预约成功率
  • Helm vs 原生K8s:部署效率对比实测
  • 零基础入门:VSCode和Anaconda的Python开发环境搭建
  • 企业级应用中的数据库连接异常处理实战
  • LobeChat适配LoRA微调模型的方法与注意事项
  • 低功耗低电流2按键2路触摸检测IC-VKD104CR SOP8触摸触控芯片原厂
  • 给文科生看的Kubernetes:用快递系统理解容器编排
  • Qwen3-8B批量推理实战:Transformers pipeline应用
  • 3倍速!微PE安装Win10的极致优化技巧
  • 5分钟原型开发:用快马验证编程范式选择
  • Molecular Operating Environment (MOE) 完整安装与使用攻略
  • 5分钟快速验证:你的项目是否会有模块导入问题
  • 自学嵌入式day32,线程
  • 金运环球:金银走势分化待非农破局,早盘关注关键技术位防守
  • C语言之最大公约数和最小公倍数问题