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

P4556 [Vani有约会] 雨天的尾巴 [模板] 线段树合并

难度 算法s 日期 题目链接
省选/NOI- 线段树合并 2025-07-19 https://luogu.com.cn/problem/4556

P4556 [Vani有约会] 雨天的尾巴 [模板] 线段树合并

大名鼎鼎的线段树合并模板题。

题意简述

给定一棵 \(n\) 个节点的树。处理 \(m\) 次修改,每次给定一个 \(x,y,z\),表示给 \(\delta(x,y)\) 这条路径上所有的节点发一份 \(z\) 类型的救济粮,最后要求输出每个节点内救济粮最多的那个种类。

范围:\(1\le n,m\le10^5\)\(1\le x,y\le n\)\(1\le z\le10^5\)

思路

  • 首先涉及到修改树上的一条路径,显然考虑用树上差分维护救济粮数量。每次修改让 \(x,y\) 对应的 \(z\) 救济粮的计数器 \(+1\)\(\text{LCA}(x,y),f(\text{LCA}(x,y))\)\(z\) 救济粮计数器 \(+1\)。然后某节点救济粮的真正数量就是其子树和。

  • 我们人为地规定根为 \(1\)

  • 那么怎么快速地维护 “某节点救济粮最多的是哪种” 呢?考虑使用 “线段树二分”。我们对每个节点建立一个线段树,维护 \([1,10^5]\) 上每种救济粮有多少。显然这样暴力开要 MLE,那么我们用动态开点线段树就好了。

  • 具体来说,线段树的每个节点维护两个变量:kindamountkind 表示该节点管辖的区间内哪种救济粮最多,amount 表示最多的救济粮有多少。pushup() 这样写:

    void pushup(int cur) {// 左儿子的 kind 总是小于右儿子的if (nodes[nodes[cur].ls].amount >= nodes[nodes[cur].rs].amount) {nodes[cur].amount = nodes[nodes[cur].ls].amount;nodes[cur].kind = nodes[nodes[cur].ls].kind;} else {nodes[cur].amount = nodes[nodes[cur].rs].amount;nodes[cur].kind = nodes[nodes[cur].rs].kind;}
    }
    
  • 对于叶子节点,kindamount 就是“原始数据”了。

  • 如何快速地统计子树和?用线段树合并就好了。我们不断向下 DFS,合并线段树。我们搜到一个节点,当所有子节点的回溯都完成时,所有子节点也都合并(到当前节点)了,这时当前节点存的 kind 就是我们想要的答案。我们要一边合并一边记录答案

  • 合并的时候,具体这样写:

    int merge(int l, int r, int a, int b) {if (not a) return b;if (not b) return a;if (l == r) {nodes[a].amount += nodes[b].amount;nodes[a].kind |= nodes[b].kind; // 重要!!!!!有可能 a 没有存放这种救济粮,kind 就没设置过!!!} else {int m = l + ((r - l) >> 1);nodes[a].ls = merge(l ,m, nodes[a].ls, nodes[b].ls);nodes[a].rs = merge(m + 1, r, nodes[a].rs, nodes[b].rs);pushup(a);}return a;
    }
    

    注意一下注释的地方就好了。我卡了很久(75pts)。

http://www.gsyq.cn/news/16319.html

相关文章:

  • 音响没声音
  • 10/5
  • java学习日记9.25
  • 关于电脑息屏后自动亮屏的的原因排查及解决方式
  • Squarepoint Challenge (Codeforces Round 1055, Div. 1 + Div. 2) A~E
  • k8s之基础概念
  • 点双连通分量例题:矿场搭建
  • 基于springboot的医护人员排班平台设计与构建(源码+文档+部署讲解)
  • 某中心2026年推出1111个技术实习岗位
  • SQL Indexes(索引) - 详解
  • Payload CMS:开发者优先的Next.js原生开源解决优秀的方案,重新定义无头内容管理
  • python语法记录
  • Go 即时通讯体系:客户端与服务端 WebSocket 通信交互
  • 读混元image论文
  • phone num
  • 当 Python 遇上 Go:Sponge 如何成为替代 Django/Flask 的理想选择 - 指南
  • 2025 年装盒机制造厂 TOP 企业品牌推荐排行榜,自动化 / 喷胶 / 牙膏 / 手机壳 / 3C 数码 / 内外盒 / 面膜 / 电子产品 / 玩具 / 日用品装盒机推荐这十家公司!
  • 英语_阅读_Chinas Spring Festival_待读
  • 2025 权威推荐!电梯源头品牌 TOP5 排行榜:实力厂家精选,品质之选不容错过
  • 2025混合机厂家最新企业品牌推荐排行榜,高效盘条式混合机,无重力混合机,犁刀式混合机,锥形混合机,卧式螺带混合机推荐这十家公司!
  • 在PyCharm中运行 wandb.login();
  • 机器学习科学家分享技术写作艺术
  • AT VP 记录
  • 实用指南:npm run build 报错:Some chunks are larger than 500 KB after minification
  • 关于主体性介枚枚介的讨究
  • 2025索道厂家最新企业品牌推荐排行榜,城市交通索道,旅游索道,滑雪索道,单人固定抱索器拖牵索道,固定抱索器吊篮式索道公司推荐
  • 我终于悟了p1970 花匠
  • 2025 年建筑工程施工总包最新推荐排行榜,以严格质量管控彰显行业实力推荐这十家公司!
  • 平滑技术(数据处理,持续更新...) - 指南
  • 实用指南:本地部署 DeepSeek R1(最新)【从下载、安装、使用和调用一条龙服务】