Logo ryp 的博客

博客

一个复杂度的简单分析

...
ryp
2025-12-01 12:50:20
She's not square

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2024-05-12 12:21:14

void add (int x, int k) { while (x <= n && k > f[x]) f[x] = k, x += lowbit (x); }

int qry (int x, int y)
{
    int res = -1e9;
    while (y >= x) {
        if (y - lowbit (y) > x) res = max (res, f[y]), y -= lowbit (y);
        else res = max (res, z[y]), y--;
    }
    return res;
}

即树状数组求区间最值。

点加的复杂度是显然的。考虑区间查。

$y$ 有两种变化:

  • 减去 $\text{lowbit} (y)$
  • 减去一

不难发现 $y$ 的减量是不小于一的。然后发现对于情况二,$y$ 的低 $\text{highbit(x)}$ 位一定全都是 $0$,那么这种情况出现次数是 $\log$ 级别的。情况二后紧跟的一定是操作一(因为 $\text{lowbit}(y) \gets 1$),这之后是连续 $\log$ 次的操作一。所以粗略复杂度是 $O(\log^2 n)$。

感性上这个上界有点松了。但我不太会势能分析。

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。