【小技巧】使用树状数组维护不等关系

例如我们想求出满足下列不等式的i和j对数
1.i < j
2.i > j - p[j]
3.j < i + p[i]

这样我们可以把j - p[j] 和 j 组成pair对于j - p[j] 从小到大排序,然后枚举i从1 - n,对于每个i,先把满足i > j - p[j] 的j添加到树状数组,然后查询树状数组从i + 1 到 i + p[i] - 1 的值即可。
下面就是大概写法,为了省事直接没用pair排序用的优先队列。

        for(int i = 1; i <= n; i++)
        {
    
    
            while(!Q.empty() && Q.top().val < i)
            {
    
    
                add(Q.top().x, 1);
                Q.pop();
            }
            //printf("%d %d\n", i + p[i * 2] / 2 - 2, i - 1);
            ans += ask(i + p[i] - 1) - ask(i);
        }

猜你喜欢

转载自blog.csdn.net/weixin_43891021/article/details/109208321