题目链接:https://vjudge.net/contest/168122#problem/I
这是另一种线段树的常见问题,相当于原本有一串长为n的1串,现将其中一些点标记为0或恢复为1,每次询问问你pos所在的最长1连续区间为多长。这种题其实之前见过,就是白书201页的LA3938,一个求动态最大连续和的问题,其实都是区间合并的问题。
思路也是类似,每个区间维护最长1前缀长度maxpre,最长后缀长度maxsuf,还有最长1长度maxsum,那么区间自下而上合并的时候就有几种情况:
1.如果查询点pos在左子区间,(1)如果左子区间的maxsuf与pos之和大于mid,也就是连续区间会扩展到右子区间,那么答案就 是maxsuf[root<<1]+maxpre[root<<1|1];
(2)否则,答案就在左子区间,递归进入左子区间query(pos,l,mid,root<<1);
2.如果查询点pos在右子区间,(1)如果pos与右子区间的maxpre之差小于mid,就说明连续子区间会扩大到左边,所以答案就是
maxsuf[root<<1]+maxpre[r