#P9883. [EC Final 2021] Fenwick Tree

    ID: 11119 远端评测题 1000ms 1024MiB 尝试: 0 已通过: 0 显示难度普及+/提高− 上传者: 标签>2021Special JudgeO2优化ICPC

[EC Final 2021] Fenwick Tree

题目描述

庞教授正在讲授关于 Fenwick 树(也称为二叉索引树)的课程。

在 Fenwick 树中,我们有一个长度为 nn 的数组 c[1…n]c[1\ldots n],初始时全为零(对于任何 1≤i≤n1\le i\le n,c[i]=0c[i]=0)。每次,庞教授可以对某个位置 pospos(1≤pos≤n1\leq pos \leq n)和一个值 valval 调用以下过程:

def update(pos, val):
    while (pos <= n):
        c[pos] += val
        pos += pos & (-pos)

注意,对于任何正整数 pos,pos & (-pos) 等于 pos 的最大 2 的幂。

在这个过程中,valval 可以是任意实数。在调用了若干次(零次或多次)后,庞教授忘记了数组 cc 中的确切值。他只记得对于每个从 11 到 nn 的 ii,c[i]c[i] 是否为零。庞教授想知道,在假设他的记忆是准确的情况下,他调用该过程的最小可能次数。

输入格式

第一行包含一个整数 T (1≤T≤105)T~(1 \le T \le 10^5),表示测试用例的数量。

对于每个测试用例,第一行包含一个整数 n (1≤n≤105)n~(1 \le n \le 10 ^ 5)。下一行包含一个长度为 nn 的字符串。如果 c[i]c[i] 非零,则字符串的第 ii 个字符为 1,否则为 0。

保证所有测试用例中 nn 的总和不超过 10610^6。

输出格式

对于每个测试用例,输出庞教授调用该过程的最小可能次数。可以证明答案总是存在的。

3
5
10110
5
00000
5
11111

3
0
3

提示

对于第一个例子,庞教授可以依次调用 update(1,1),update(2,-1),update(3,1)。

对于第三个例子,庞教授可以依次调用 update(1,1),update(3,1),update(5,1)。

题面翻译由 ChatGPT-4o 提供。