首页 > 其他 > 详细

[学习笔记]线段树分治

时间:2019-02-07 18:47:55      阅读:173      评论:0      收藏:0      [点我收藏+]

https://www.luogu.org/blog/Miracevin/shuo-ju-jie-gou

一种离线处理方法

可以处理“具体哪个修改对询问有影响”、可以贡献不独立、可以支持插入删除

技术分享图片

例题 7
? 给出一张图
? 对每个点求出强制这个点点度为 1 的最小生成树的权值

? ?? ≤ 100000, ?? ≤ 300000

每个边存在三段:[1,x-1],[x+1,y-1][y+1,n]

LCT维护最小生成树

i的答案再加上和i相邻的边权最小值

 

例题 8
? 给一棵树,边有边权
? 每次操作是删除一条边并加入一条边,保证操作完还是树
? 你需要维护有多少点对 ??, ?? 的路径上所有数的最大公约数是 1
? ?? ≤ 100000, ???? ≤ 100000, ?? ≤ 30000

反演一下得到:

ans=∑miu(d)f(d)

f(d)表示路径上的点都是d的倍数的点对的个数

也就是,所有是d的倍数的点构成的若干个联通块,f(d)=∑szi*(szi-1)/2

 

考虑对每个边出现的区间进行线段树分治

然后dfs,用按秩合并并查集维护每个d的f(d),也就是维护好联通块∑szi*(szi-1)/2

每加入一个边,枚举这个边两边的点的gcd的约数d,再对每个并查集进行维护。

栈序撤销

(当然LCT也可以,常数爆炸就是了)

 

例题 9
? (CTSC2016)
? 你需要维护若干个版本的集合,每个集合元素是 ??, ??
? 每次可以扩展一个版本,扩展内容为加一个新元素或删除一个已
有元素
? 每次询问一个 ??,要你在给定版本 ?? 的集合中找出 ??, ?? 使得
?? ? ?? 2 + ?? 最小
? ??, ?? ≤ 1000000

 

[学习笔记]线段树分治

原文:https://www.cnblogs.com/Miracevin/p/10355084.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!