询问 x 要求把所有满足 (x & i)=i 的展位金额求和,即展位编号 i 是 x 的按位子集。
n,x≤2×105<218,把 18 位拆成低 10 位与高 8 位。对每个高位组 h 开长度为 1024 的数组,把展位 i 的金额放入 (hi,li),再对低位做子集和。处理后 groups[h][mask] 表示高位为 h、低位为 mask 子集的金额和。
回答 x=(hx,lx) 时,枚举 hx 的所有子集 s,累加 groups[s][l_x]。
展会把 n 个展位按 1 到 n 编号,第 i 号展位的结算金额为 ai。财务按掩码 x 做一次汇总:把所有满足
的展位金额加总,也就是 i 的二进制 1 位必须全部落在 x 中。符号 & 表示按位与:对应位都为 1 时结果位为 1,否则为 0。现有多组测试,每组给出展位金额和若干询问掩码,请按询问顺序输出每次汇总结果。
约束:测试组数不超过 100000;每组展位数与询问数均不超过 200000;所有测试中 n+q 之和不超过 500000;金额满足 −10≤ai≤1000000000;询问掩码满足 0≤x≤200000。
第一行一个整数 T,表示测试组数。
每组数据:
第一行两个整数 n 和 q,表示展位数与询问数;
第二行 n 个整数 a1,a2,…,an,表示金额;
第三行 q 个整数 x1,x2,…,xq,表示询问掩码。
保证 1≤T≤100000,1≤n,q≤200000,所有测试中 n+q 的总和不超过 500000,−10≤ai≤1000000000,0≤x≤200000。
对每组数据按询问顺序输出 q 行,每行一个整数,表示该询问的金额总和。
输入
2
4 3
8 1 -3 2
1 3 8
5 2
4 4 4 4 4
0 15
输出
8
6
0
0
20
说明
第一组 n=‘4‘,a=[8,1,−3,2]:
8;6;1 到 4 均不是其按位子集,和为 0。
第二组五个权值均为 4:x=‘0‘ 无合法下标,和为 0;x=‘15‘ 时 1 到 5 都合法,和为 20。输入
1
6 2
7 -2 5 1 0 3
2 9
输出
-2
7
说明
n=‘6‘,a=[7,−2,5,1,0,3]:
-2;1001)时合法下标为 i=‘1‘ 与 i=‘8(超出 n),故只有 i=‘1‘,和为 7。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册