动态点分树

news/2025/10/27 17:09:41/文章来源:https://www.cnblogs.com/LastKismet/p/19169630
更新日志 2025/10/27:开工。

概念

首先你应当会点分树。

动态点分树可以支持每次加一个叶子结点并动态维护点分树结构平衡的数据结构。

思路

利用替罪羊树的思想,考虑 \(\alpha\) 重构。也就是说,每加入一个节点后,枚举其所有祖先,找到深度最低的,满足子树大小超过了父节点子树大小 \(\alpha\) 倍的子树(如果有),并重构整棵子树。重构的话直接对整棵子树重新跑一遍点分治即可。

同替罪羊树思想,\(\alpha\) 大致取 \(0.8\) 可以使总重构点数为 \(n\log n\) 级别,原理我不太懂,毕竟我不会替罪羊树。qwq

有一些可能有用的实现细节,就是对每个点开两个数组顺次存下他的祖先与到其的距离,重构时对子树内每个点的这个动态数组同时弹出,直到弹出要重构的子树根节点为止,那么剩下的就是不用重构的祖先。点分治时把当前分治块内所有点推入当前分治中心及距离即可。

例题

紫荆花之恋

后面补一份完整题解。这里就先只放代码了。

代码
const int N=1e5+5,V=1e9,B=320;
const flt A=0.8;int n;
struct sq{vec<ll> big,sml,t;inline void ins(ll x){sml.pub(x);if(sml.size()>B){int a=0,b=0;t.clear();sort(sml.begin(),sml.end());while(a<big.size()&&b<sml.size())t.pub(big[a]<sml[b]?big[a++]:sml[b++]);while(a<big.size())t.pub(big[a++]);while(b<sml.size())t.pub(sml[b++]);sml.clear();big=t;}}inline ll query(ll v){int res=upper_bound(big.begin(),big.end(),v)-big.begin();for(auto i:sml)if(i<=v)++res;return res;}inline void clear(){big.clear(),sml.clear();}
}dat[N],daf[N];int Fa[N];
vec<pil> g[N];
ll r[N];
vec<int> son[N],grd[N],grl[N];bool don[N];int siz,sz[N];
void gsiz(int x,int f){sz[x]=1;for(auto e:g[x]){int y=e.fir;if(!don[y]&&y!=f)gsiz(y,x),sz[x]+=sz[y];}
}
int rot,mx[N];
void grot(int x,int f){mx[x]=siz-sz[x];for(auto e:g[x]){int y=e.fir;if(!don[y]&&y!=f)grot(y,x),chmax(mx[x],sz[y]);}if(mx[x]<mx[rot])rot=x;
}
void dfs(int x,int f,int z,int dp){dat[z].ins(dp-r[x]);if(Fa[z])daf[z].ins(grl[x].back()-r[x]);grd[x].pub(z),grl[x].pub(dp);son[z].pub(x);for(auto e:g[x]){int y=e.fir;if(!don[y]&&y!=f)dfs(y,x,z,dp+e.sec);}
}
void calc(int x,int fa){gsiz(x,x);siz=sz[x];mx[rot=0]=inf;grot(x,x);x=rot;Fa[x]=fa;for(auto e:g[x]){int y=e.fir;if(!don[y])dfs(y,x,x,e.sec);}dat[x].ins(-r[x]);if(fa)daf[x].ins(grl[x].back()-r[x]);don[x]=1;for(auto e:g[x]){int y=e.fir;if(!don[y])calc(y,x);}
}inline void Main(){int T;cin>>T>>n;ll ans=0;rep(i,1,n){int a,c;cin>>a>>c>>r[i];a^=ans%V;if(!a){dat[1].ins(-r[i]);}else{g[a].pub({i,c}),g[i].pub({a,c});Fa[i]=a;grd[i]=grd[a],grl[i]=grl[a];grd[i].pub(a),grl[i].pub(0);for(auto &j:grl[i])j+=c;repl(j,0,grd[i].size()){int x=grd[i][j];ans+=dat[x].query(r[i]-grl[i][j]);if(j)ans-=daf[x].query(r[i]-grl[i][j-1]);son[x].pub(i);dat[x].ins(grl[i][j]-r[i]);if(j)daf[x].ins(grl[i][j-1]-r[i]);}dat[i].ins(-r[i]);daf[i].ins(c-r[i]);repl(j,1,grd[i].size())if(son[grd[i][j-1]].size()*A<son[grd[i][j]].size()){int x=grd[i][j-1],f=Fa[x];don[f]=1;for(auto y:son[x]){while(1){int t=grd[y].back();grd[y].pob(),grl[y].pob();if(t==x)break;}son[y].clear();don[y]=0;dat[y].clear(),daf[y].clear();}son[x].clear();don[x]=0;dat[x].clear(),daf[x].clear();calc(x,f);break;}}put(ans);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/947910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年隔热条厂家权威推荐榜:尼龙隔热条/PA66尼龙隔热条/建筑用隔热条/断桥铝门窗隔热条/幕墙隔热条/阳光房隔热条/国标隔热条精选

2025年隔热条厂家权威推荐榜:尼龙隔热条/PA66尼龙隔热条/建筑用隔热条/断桥铝门窗隔热条/幕墙隔热条/阳光房隔热条/国标隔热条精选 随着建筑节能要求的不断提高和绿色建筑理念的深入推广,隔热条作为建筑节能的关键材…

【前端效率工具】:告别右键另存,不到 50 行代码一键批量下载网页图片

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣先看效果:在素材网站一键批量保存所有图片废话不多说,直接上手! 项目结构image-downloader-extension ├── manifest.json # 扩展的"身份证"…

特殊符号的输入

特殊符号的输入符号 说明 Alt编码© 版权符号 Alt+0169 注册商标 Alt+0174™ 商标 Alt+0153• 项目符号 Alt+0149 正负号 Alt+0177 乘号 Alt+0215 除号 Alt+0247 度 Alt+0176… 省略号 Alt+0133√ 对勾 Alt+251≤ …

Luogu P3237 [HNOI2014] 米特运输 题解 [ 蓝 ] [ 树形 DP ] [ 哈希 ]

米特运输 不是很难,但是思路很巧妙的一道题。 手模样例,观察合法方案的性质,容易发现,只要有一个节点权值是固定的,那么整棵树所有节点的权值便也固定了。 而由于每个节点之间是倍数关系,因此我们需要一个基本单…

「Gym 104901F」Say Hello to the Future

题目大意 给定一个序列,定义其权值为划分序列的方案数,使得划分出来的每个区间 \([l, r]\) 有 \(\max_{i = l}^r {a_i} \leq r - l + 1\) 。对于每个 \(1 \leq i \leq n\) 求只将 \(a_i\) 修改为 \(1\) ,序列的权值…

渐进过程中大O与小o混用

在数学中,大O符号(O)和小o符号(o)都用于描述函数的渐进行为,但它们的含义和强度不同。在实际使用中,需要注意它们的定义和适用场景,以避免误用。 \(O(x)\) 表示一个函数的渐进上界。具体来说,如果存在正常数C…

Navicat 17 超详细保姆级下载安装教程:附激活工具使用步骤​

这篇教程给你讲的Navicat 17安装方法,从下载到激活一步不落,中间碰到问题也能帮你解决,跟着做保准能装好。​这篇教程给你讲的Navicat 17安装方法,从下载到激活一步不落,中间碰到问题也能帮你解决,跟着做保准能装…

消息队列的有序性

RabbitMQ单一队列和单一消费者模式:确保一个队列只被一个消费者消费,这样可以保证消息按照发送的顺序被处理。因为队列本身就是一个先进先出的结构。 消息排序:在消息生产者端,为消息添加序列号和时间戳,消费者根…

【LTDC】DMA2D —— 嵌入式系统的 GPU

前言 ST 公司设计了一个专门用于图像处理的 DMA:DMA2D,可以之际通过 DMA2D 搬运或填充图像,而不经过 CPU,极大减轻了 CPU 的负担。为了学习 DMA2D,我也专门写了这篇文章,现在就让我们来看看吧! DMA2D 工作模式 …

各个版本的sqlite-jdbc jar下载链接

https://repo1.maven.org/maven2/org/xerial/sqlite-jdbc

[电脑]win10下SVN图标不显示

[电脑]win10下SVN图标不显示转自 : https://blog.csdn.net/qq_43331089/article/details/128876896win10系统的SVN图标不现实了。正常情况下,会在文件夹上有一个对勾 但是对勾以及所有的SVN图标都突然消失了,都不知道…

2025/10/27~2025/11/2 做题笔记 - sb

2025/10/27 第一代图灵机 一样的套路,考虑每一个右端点对应的最左边可以到哪里,显然是最小的 \(j\) 使得 \(\max\limits_{j \le k \le i}pre_k = j - 1\)。考虑线段树维护一个区间内的最大的答案和最大的 \(pre_i\),…

echart - f

series: [{name: "直接访问",type: "bar",// 修改柱子宽度barWidth: "35%",data: [200, 300, 300, 900, 1500, 1200, 600],itemStyle: {// 修改柱子圆角barBorderRadius: 5}}]series中的…

完整教程:LinuxC++——etcd分布式键值存储系统入门

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

基于MATLAB的光学CCD全息成像仿真程序实现

基于MATLAB的光学CCD全息成像仿真程序实现一、流程 graph TD A[物光生成] --> B[参考光干涉] B --> C[全息图记录] C --> D[CCD光电转换] D --> E[电荷转移] E --> F[噪声注入] F --> G[信号重建]二…

el-date-picker样式修改

el-date-picker样式修改模板<el-col :span="12"><div class="detail-row flex-row"><span class="detail-label"><span style="color: red;margin-right: 4p…

我从哪里起飞 从哪里降落 多少不能原谅的错 却不能重来过

10.27 CF1988F Heartbeat P10440 [JOIST 2024] 环岛旅行 / Island Hopping P10439 [JOIST 2024] 逃生路线 2 / Escape Route 2

unity管理器设计:Manager of Managers

一、管理器Manager Manager管理器是对一类对象进行统一管理,像是UIManager,AudioManager,InputManager等。 UIManager对UI的生命周期进行统一管理,AudioManager对音频的播放进行统一管理,InputManager对玩家的输入…

iview table 排序 columns 里面写 sortable: custom 不要写 sortable: true 不然会进行二次内部排序序号等 字段。

iview table 排序 columns 里面写 sortable: custom 不要写 sortable: true 不然会进行二次内部排序序号等 字段。--------------------------------------------- 生活的意义就是你自己知道你要做什么,明确目标。没有…

决策不再凭感觉!Tita用数据驱动销售与交付的一体化协同

在当今激烈的市场竞争中,企业高层管理者们正面临一个普遍而棘手的难题:销售目标设定明确,但执行过程却总是脱节;客户信息散落在各个销售人员的Excel表和笔记本中,难以形成有效的客户洞察;销售过程缺乏透明化管控…