例如我们想求出满足下列不等式的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);
}