第一步 lowbit 和建表
最终作品第一步:写出 lowbit 和 fen_build。建好之后输出树状数组第 4 格存的值——按规则它应该是前 4 个数的和。 (本题用 g++ -std=c++17 -O0 编译。)
第二步前缀和与区间和
加上 fen_prefix 和 fen_range。把两个结果拼起来输出:前 3 个的和、第 2 到第 4 个的和,中间用 / 隔开。 (本题用 g++ -std=c++17 -O0 编译。)
第三步单点修改
加上 fen_add:给第 i 个加 v,往上一路加 lowbit 更新。给第 2 个加 10 之后,输出前 3 个的和。 (本题用 g++ -std=c++17 -O0 编译。)
第四步再写个布隆过滤器
写出 8 位的布隆过滤器(两个哈希:k % 8 和 (k * 3) % 8),加进 17、24、15。把三个查询结果拼起来输出,用 / 隔开:查 15、查 13、查 10。⚠️ 中间那个 13 从没加过,但结果会是「可能在」——那就是误判。
交付树状数组加布隆
这是这条路线的最终作品。树状数组(lowbit / fen_build / fen_prefix / fen_range / fen_add)和布隆过滤器的框架都给好了,补全其中的关键函数,然后一次验完五条:前 3 个的和是 56、整段的和
暴力区间求和为什么超时
10 万个数、12 万次操作,逐个相加的暴力区间求和过不了 1 秒限时,根本原因是【0】。
补写线段树区间查询
场景:实验机上 ~/work/adv/seg.cpp 已经会建线段树了,但区间查询 query 还没写。 任务:补全 query。make 编译(带内存检查),./seg < sample.txt 自测。check 会用每次现造的随机
十万次区间和一秒内
场景:~/work/adv/sum.cpp 支持「单点加」和「区间求和」两种操作,结果对,但 10 万个数、12 万次操作要跑好几秒。 任务:改写 sum.cpp,让大数据在 1 秒内跑完,输出格式不变。make 编译(-O2),time
实现树状数组两个操作
场景:~/work/adv/bit.cpp 按指令操作一个树状数组,add 和 sum 两个函数还是空的。 任务:补全 add 和 sum。make 编译(带内存检查)后用 sample.txt 自测;check 会用随机的操作序列和一个朴
线段树数组开小了
场景:~/work/adv/seg2.cpp 的线段树数组只开了 2n 格,数一多内存检查就报越界。 任务:把数组开到够用的大小,make 编译后运行时不再报内存错误、结果正确才算过。 可操作范围:只在分给你的这台实验机上操作。可以改家目录