例如我们想求出满足下列不等式的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();
}
ans
+= ask(i
+ p
[i
] - 1) - ask(i
);
}