胡乱分析
区间合并操作指的是在给定的区间内,计算出例如10111011中的最大1的个数
分组解析
build操作
build操作与之前的求值的build操作一样,初始化的时候ls,rs,ms都是r+1-l初始化区间都是1
1 | void build(int p,int l,int r) |
change操作
这个题是单点的更改,change操作与之前不同的地方在于push_up操作原先的push_up仅仅只是把值修改一下这里修改的是区间的长度,所以有所不同
首先更新ls ls=左的ls
rs=右的rs
ms=等于左的ms右的ms和中间右左左右的加和的最大值
其中如果ls溢出那么加上右的左
rs溢出同理
1 | void change(int p,int x,int y) //change函数 |
sum操作
这里的sum求的是包含这个点的最大的区间长度所以如果到点了或者满了或者没有那么就返回即可
然后分左右合并,如果满了就加上即可跟change的感觉差不多
1 | int sum(int p,int x) |
完整代码(hdu-1540)
1 |
|