回滚莫队?滚滚滚滚起来!


 回滚莫队

             这名字真的取的有意思,一开始还不觉得,学了之后发现他真的在回滚.我们回滚莫队排序是按之前的莫队一样将询问  左块右位置 的来排序.
        回滚问题特别之处在哪里?
        他在滚.

    特别之处1

              我们对于左右端点都在同一块里的,直接暴力for 1遍统计答案,复杂度根号n.

    特别之处2

              我们是枚举每一块来统计答案的.此时我们只处理左端点在此块,右端点在右块的询问,左右同块的见1.我们把ql指针指向下一块的开头,qr指针指向这一块的末尾.对于此本块询问,我们先将qr指针向右移更新信息直到此询问的右端点.(当我们处理下一个询问的时候,qr只需要继续右移就可以了,因为询问左端点都同块的时候,我们是按右端点位置从小到大排序的,所以单调递增).
        这里好像没有回滚,并且由于qr单调递增,区间扩大,并没有删除操作.
        但是我还没讲ql.
        本块包含询问的左端点一定在ql左边(见ql定义).我们就将ql向左移更新答案(此时区间仍然在扩大,只有更新操作没有删除操作),到了询问的左端点,统计答案.
        然后就开始滚了,并且是回滚.ql向左到达询问左端点后,向右往初始位置(见ql定义)移,删除之前一路滚过来所更新的信息.然后ql回滚回来,qr仍不动,处理下个询问.
        所以就是 qr向右移动更新信息到询问右端点->ql向左滚 边滚边更新 至询问左端点,然后处理此区间答案,ql回滚删除之前一路滚来更新的信息,回到初位置->处理(下个询问->本块询问处理完->枚举下个块.
        回滚得十分形象.
        一道练手题:点这里(可以用分快做但最好用回滚莫队练练手,看了我的代码你就懂了).

你可能感兴趣的:(莫队)