学习笔记(带修主席树)
带修主席树 感谢YMY大佬非常非常详细的口糊和debug(v.) ,首先主席树是离线算法。 普通主席树是权值线段树,求区间里有几个数,就是用前缀和相减的方式。 其实带修主席树也大同小异。 算法实现 首先你需要离线所有的操作,主要是要将修改之后的值也离散进取 对于每次修改,用树状数组的方式每次加lowbit(),对每个点都insert一下。 对于每次询问,先开两个数组,将左右端点树状数组的跳的点都存下来,每次查询区间都用所用又端点减所有左端点,进左右子树时,也要将这些点换成左右子树。 洛谷 Dynamic Ranking #include<bits/stdc++.h> using namespace std; typedef int sign; typedef long long ll; #define For(i,a,b) for(register sign i=(sign)a;i<=(sign)b;++i) #define Fordown(i,a,b) for(register sign i=(sign)a;i>=(sign)b;--i) const int N=1e4+5; bool cmax(sign &a,sign b){return (a<b)?a=b,1:0;} bool cmin(sign &a,sign b){return (a>b)?a=b,1:0;}