线段树板子
1.01穷举模板(dfs)2.单调栈板子3.拓补排序板子(邻接表实现)4.堆结构与堆排序5.LCS(递归/记忆化/dp)6.树状数组板子(单点增加+范围查询)7.位运算内容8.线段树板子9.前缀树板子10.树状数组板子11.数论分块12.ST表模板(RMQ查询)13.扩展欧几里得算法模板14.快速幂模板15.同余式/乘法逆元/费马小引理16.矩阵乘法/矩阵快速幂模板17.分解质因数18.埃氏筛/欧拉筛模板19.欧拉函数/欧拉定理/扩展欧拉定理20.拓补排序板子(卡恩算法/21.最短路Djikstra算法板子22.LIS板子(二分优化)23.LCS板子24.SPFA板子25.prim板子26.并查集板子27.Kruskal板子
28.线段树板子
29.字符串哈希板子30.KMP板子31.子集生成(位运算版本)32.归并排序求逆序对板子33.Tarjan算法求LCA板子34.树链剖分求LCA板子35.前缀树板子36.01 trie板子37.主席树模板再来!
发现参数传数组时,时间复杂度暴涨
结构体要规定在全局变量
否则空间不允许
query要pushdown
先pushdown在pushup
const int maxn=1e5+5; int arr[maxn]; struct SGT{ struct node{ int l,r,sum; int lazy; }tr[4*maxn]; void build(int p,int l,int r){ tr[p]={l,r,arr[l],0}; if(l==r)return; int m=l+r>>1; build(2*p,l,m);build(2*p+1,m+1,r); tr[p].sum=tr[2*p].sum+tr[2*p+1].sum; } void add(int p,int x,int plus){ if(tr[p].l==x&&tr[p].r==x){ tr[p].sum+=plus;return; } int m=tr[p].l+tr[p].r>>1; if(x<=m)add(2*p,x,plus);else add(2*p+1,x,plus); tr[p].sum=tr[2*p].sum+tr[2*p+1].sum; } void pushdown(int p){ if(tr[p].lazy!=0){ int debt=tr[p].lazy; tr[2*p].sum+=(tr[2*p].r-tr[2*p].l+1)*debt; tr[2*p+1].sum+=(tr[2*p+1].r-tr[2*p+1].l+1)*debt; tr[2*p].lazy+=debt;tr[2*p+1].lazy+=debt; tr[p].lazy=0; } } int query(int p,int l,int r){ if(l<=tr[p].l&&tr[p].r<=r){ return tr[p].sum; } pushdown(p); int m=tr[p].l+tr[p].r>>1; int sum=0; if(l<=m)sum+=query(2*p,l,r); if(r>m)sum+=query(2*p+1,l,r); return sum; } void pushup(int p){ tr[p].sum=tr[2*p].sum+tr[2*p+1].sum; } void add(int p,int l,int r,int plus){ if(l<=tr[p].l&&tr[p].r<=r){ tr[p].sum+=(tr[p].r-tr[p].l+1)*plus; tr[p].lazy+=plus;return; } int m= tr[p].l+tr[p].r>>1; pushdown(p); if(l<=m)add(2*p,l,r,plus); if(r>m)add(2*p+1,l,r,plus); pushup(p); } }; SGT segment_tree;
本文作者:Ben`s code
本文链接:https://www.cnblogs.com/benscode/p/18751556
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步