列队中对询问离线排序后如何建立树状数组

假设\(m=5\)

其中黑框框表示前\(m-1\)个人,绿框框表示后面加入进来的人,从下文可以知道具体编号不重要

对任意时刻,定义真实位置是\(i\)表示以上数组下标为\(i\)

假设我们现在要删除实际方阵中第二个人,那么我们在这个数组中找到前缀和为\(2\)的位置\(x\),将其变为0,并将绿框框中最前的一个\(0\)变为\(1\),那么这个询问的真实位置就是\(x\)

假设我们现在要删除实际方阵中第四个人,那么我们在这个数组中找到前缀和为\(4\)的位置\(x\),将其变为0,并将绿框框中最前的一个\(0\)变为\(1\),那么这个询问的真实位置就是\(x\)

假设我们现在要删除实际方阵中第五个人,我们就对这一个询问标记一个flag,之后再处理

这样每一个询问的真实位置就可以算出来

由于询问最多\(q\)次,所以树状数组的大小是\(O(m+q)\),其中黑框框是\(m\),绿框框是\(q\)

posted @ 2023-12-17 12:01  最爱丁珰  阅读(1)  评论(0编辑  收藏  举报