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

it2025-03-05  25

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