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

动态点分树

更新日志 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.hskmm.com/?act=detail&tid=40043

相关文章:

  • 「Gym 104901F」Say Hello to the Future
  • 渐进过程中大O与小o混用
  • Navicat 17 超详细保姆级下载安装教程:附激活工具使用步骤​
  • Luogu P3237 [HNOI2014] 米特运输 题解 [ 蓝 ] [ 树形 DP ] [ 哈希 ]
  • 消息队列的有序性
  • 【LTDC】DMA2D —— 嵌入式系统的 GPU
  • el-date-picker样式修改
  • 各个版本的sqlite-jdbc jar下载链接
  • 2025/10/27~2025/11/2 做题笔记 - sb
  • 2025 年环保搅拌设备,搅拌装置设备,框式搅拌设备厂家最新推荐,实力品牌深度解析采购无忧之选!
  • 2025 年搅拌器搅拌设备,侧入式搅拌设备,斜插式揽拌设备,卧式搅拌设备厂家最新推荐,聚焦资质、案例、售后的五家企业深度解读
  • 芯片实现路线图
  • 2025 年顶入式搅拌设备,直叶搅拌设备,节能减排搅拌设备厂家最新推荐,技术实力与市场口碑深度解析
  • 2025 年矿用平板车,重型平板车,履带平板车,矿山平板车厂家最新推荐,产能、专利、环保三维数据透视!
  • 2025 年 10 月翻斗式矿车,侧翻矿车,1 吨矿车,运输矿车厂家最新推荐,产能、专利、环保三维数据透视
  • 醒图电脑版下载与安装教程(2025最新版)
  • 读书笔记:告别数据冗余!Oracle引用分区让父子表管理如此简单
  • 零点哥哥的站,当然得好好把玩!
  • 2025年钢质喷塑电缆桥架优质厂家权威推荐榜单:316不锈钢桥架/线缆不锈钢桥架/梯式不锈钢电缆桥架源头厂家精选。
  • OpenAI推出企业级SharePoint连接器,挑战Microsoft 365 Copilot
  • 2025 年定制矿车,大型矿车,固定式矿车厂家最新推荐,产能、专利、环保三维数据透视
  • 何为高阶组件(higherordercomponent) ?
  • CentOS下Docker部署mysql8.0
  • 杭州AI优化企业:国内GEO领域技术标杆 - 二当家
  • 构建定时 Agent,基于 Spring AI Alibaba 实现自主运行的人机协同智能 Agent
  • 《代码大全2》观后感(一):从“写代码”到“做工程”的思维跃迁
  • 2025 年空气悬浮鼓风机,磁悬浮鼓风机,章鼓鼓风机厂家最新推荐,产能、专利、环保三维数据透视!
  • 洞悉过往,一目了然:浅述视频融合平台EasyCVR如何实现海量视频录像的智能检索与高效回看
  • Node-RED正在颠覆整个物联网网关行业
  • 2025 年进口螺杆泵,萨伯特螺杆泵,污泥螺杆泵厂家最新推荐,实力品牌深度解析采购无忧之选!