动态开点线段树不再具有left = u << 1, right = u << 1 | 1的性质,但是不需要离散化就可以处理大范围的数,包括负数 1#include <bits/stdc++.h>2usingnamespacestd;34constintN = 1e5 +5;56intn, m, nidx;7intw[N];8structnode {9intl, r;10LL sum, add;11}tr[N <<6];1213voidpushup...
PushUp(pos);//子节点更新之后本节点也需要更新;}voidUpZone(longlongpos,longlongl,longlongr,longlongL,longlongR,longlongC)//对整个区间进行修改{//L,R表示操作区间 , l,r表示当前节点区间 , pos表示当前节点编号if(L<=l && R>=r)//节点区间在操作区间之内,直接返回{ sum[pos]+=C*(r-l+1);...
Q次操作,或修改单点颜色,或查询路径颜色为x的个数。 思路:由于是路径,想到树剖+线段树,但是颜色个数无法合并,因此不行。 换个思路,用差分来求,然后把每个颜色弄个线段树,然后这个颜色的线段树单点代表的是这个点到根有多少这个颜色。 如果x点加了一个颜色为y的,那么以y这棵树,就再某个范围加1,这个范围是x...