酷代码 AI
菜单
服务商

给定长度为 n 的序列 a1,a2,⋯,an 。 你需要回答多次询问,每次询问会给出一个数字 k ,请问序列中所有数字或 k 之和减去所有数字与 k 之和是多少,即求 ∑ni=1ai|k−∑ni=1ai&k 。 输入格式 第一行输入一个整数 n 。 第二行输入 n 个整数 a1,a2,⋯,an 。 第三行输入一个整数 q ,表示询问次数。 接下来 q 行,每行输入一个整数 k 。 输出格式 对于每次询问,输出一行一个整数,表示答案。 样例输入 5 1 2 3 4 5 5 1 2 3 4 5 样例输出 14 17 16 19 18 数据范围 对于 30% 的数据,保证 n,q≤1000 。 对于 100% 的数据,保证 1≤n,q≤5×105,1≤ai,k≤109 。 用C++(不要O(nq)复杂度)

```cpp #include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; // 存储序列a vector<int> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } int q; cin >> q; // 提前计算所有数字的或和与和 int or_sum = 0; int and_sum = 0; for (int i = 0; i < n; ++i) { or_sum += a[i]; and_sum += a[i]; } for (int i = 0; i < q; ++i) { int k; cin >> k; int result = 0; // 计算所有数字或k之和 int or_result = 0; // 计算所有数字与k之和 int and_result = 0; for (int j = 0; j < n; ++j) { or_result += (a[j] | k); and_result += (a[j] & k); } result = or_result - and_result; cout << result << endl; } return 0; } ``` 1. 首先读取序列的长度 `n` ,并将序列存储在向量 `a` 中。 2. 接着读取询问次数 `q` 。 3. 提前计算所有数字的或和与和(这里只是占位,后续会重新计算每个询问的结果)。 4. 对于每次询问,读取询问的数字 `k` ,分别计算所有数字或 `k` 之和与所有数字与 `k` 之和,两者相减得到结果并输出。 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 注意数据范围,对于本题中 `1≤ai,k≤109` ,要确保计算过程中不会出现溢出情况。 2. 对于多次询问的情况,要考虑是否可以提前预处理一些数据来降低时间复杂度,避免使用 `O(nq)` 复杂度的算法。 3. 在处理位运算时,要清楚位运算的优先级,避免因优先级问题导致结果错误。 [2025-10-17 20:05:07 | AI写代码神器 | 534点数解答]

相关提问
发财导航,免费问AI
实用工具查看更多