支持修改主席树
来源:互联网 发布:无冬之夜1 mac 编辑:程序博客网 时间:2024/05/16 15:11
主席树很经典,一般的”k-th number”问题都用它来解决,
主席树的内存存储与可持久化线段树差不多,
但如果要兹瓷修改呢?把有关的点都改一遍?
兹瓷修改主席树
觉得兹瓷修改主席树与主席树没有太大的关系
用树套树来实现,
内存上的存储外面是树状数组,套一个线段树,(注意,是线段树)
修改就和树状数组的求和修改差不多,只是把普通的加减修改变成了修改对应的线段树,
查询时,我们是先走线段树,再在线段树中做树状数组,
先用数组记录一下[1,l-1]和[1,r]中的在树状数组中的根,也就是对应的区间,
对于线段树中的一个区间,我们已知每棵线段树当前区间内的个数,用树状数组求和,就可以得出[1,mid]和[1,r]这两个区间的个数,于是就可以判断是往左走还是往右走,再对应的把记录的数组中所有的区间往左或往右走即可,
复杂度:
Key Code
void change(int l,int r,int &e,int l2){ if(!e)e=++b0;b[e].s++; if(l==r)return; int t=(l+r)/2; if(l2<=t)change(l,t,b[e].l,l2); else change(t+1,r,b[e].r,l2);}void modify(int q,int e)//在树状数组上修改{ for(int i=q;i<=n;i+=NX(i))change(1,n,root[i],e);}int HOW(int q)//统计区间个数{ int ans=0; fo(i,1,h[q][0])ans+=b[b[h[q][i]].l].s; return ans;}int find(int l,int r,int l2){ if(l==r)return l; int t=(l+r)/2; int t1=HOW(1)-HOW(0); if(l2<=t1) { fo(j,0,1)fo(i,1,h[j][0])h[j][i]=b[h[j][i]].l;//把整个记录数组往左走 return find(l,t,l2); } fo(j,0,1)fo(i,1,h[j][0])h[j][i]=b[h[j][i]].r;//往右走 return find(t+1,r,l2-t1);}int search(int l,int r,int l2)//记录数组先指向根{ h[0][0]=h[1][0]=0; for(int i=r;i;i-=NX(i))h[1][++h[1][0]]=root[i]; for(int i=l-1;i;i-=NX(i))h[0][++h[0][0]]=root[i]; return find(1,n,l2);}
0 0
- 支持修改主席树
- 支持修改的主席树,例题:zoj2112
- 可修改主席树
- 可修改主席树
- 主席树 待修改
- 带修改的主席树
- 主席树区间修改模板
- 不带修改主席树模板
- 不进行修改操作的主席树
- 主席树(不含修改)模板
- 数据结构--主席树(不带修改)
- 主席树(不带修改)小结
- 主席、树、主席树!
- 主席树 求区间第k大数(可修改)
- BZOJ 1901 Zju 2112 Dynamic Rankings 带修改主席树
- 主席树模板求不带修改的区间k大
- SPOJ TO THE MOON 主席树(有动态修改)
- HDU 4348 To the moon 【主席树+区间修改】
- LightOJ 1369
- 在Mac上搭建本地Apache服务器一些注意点
- hdu4323(编辑距离)
- ccnu_暑假周赛1
- Spring PostConstruct
- 支持修改主席树
- Python模块之codecs
- Eclipse安装Maven插件
- 通达OA2015版工作流插件和列表控件数据解析
- ReactNative-ios 生成bundle文件
- elasticsearch 配置文件介绍
- 我们为什么选择Java
- 安卓可伸缩的linearlayout
- asp.net调用前台js调用后台代码分享