C++ 代码优化:从超时到高效处理询问,避免开发陷阱
原代码超时的主要原因在于对于每次询问,都要遍历整个序列计算按位或和按位与的和,时间复杂度为 $O(q * n)$。可以通过提前预处理序列元素的和,来优化时间复杂度。 优化思路: - 对于 `or` 和 `and` 操作,有 $(a | k) - (a & k) = a \oplus k$(异或操作)。 - 提前计算序列所有元素的和 `sum`,对于每次询问,结果为 `sum + n * k - 2 * (a[0] & k + a[1] & k + ... + a[n - 1] & k)`。 以下是优化后的代码: ```cpp #include <iostream> using namespace std; const int MAXN = 5e5 + 5; int a[MAXN]; int main() { int n; // 读取序列的长度 cin >> n; long long sum = 0; // 存储序列元素的和 for (int i = 0; i < n; ++i) { // 读取序列中的每个元素 cin >> a[i]; sum += a[i]; } int q; // 读取询问的次数 cin >> q; for (int i = 0; i < q; ++i) { int k; // 读取每次询问的数字k cin >> k; long long andSum = 0; for (int j = 0; j < n; ++j) { // 计算序列中每个元素与k按位与的和 andSum += a[j] & k; } // 利用公式计算结果 long long result = sum + (long long)n * k - 2 * andSum; // 输出结果 cout << result << endl; } return 0; } ``` 优化后的代码对于每次询问,只需要计算 `and` 的和,时间复杂度为 $O(q * n)$,但实际计算量有所减少,能有效减少运行时间。 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 注意数据类型的选择,当数据范围较大时,要使用 `long long` 类型,避免整数溢出。 2. 对于按位运算,要清楚其优先级和结合性,避免因运算符优先级问题导致结果错误。 3. 预处理数据时,要确保计算的准确性,特别是在计算序列元素和时,不要遗漏元素。 ######[AI写代码神器 | 589点数解答 | 2025-10-17 20:06:55]
- 巴黎奥运:中国女排淘汰赛对决土耳其,朱婷成致胜关键!(字节豆包 | 448点数解答 | 2024-08-06 15:59:48)168
- CentOS下Java进程出现futex_wait_queue_me问题的处理全流程(阿里通义 | 283点数解答 | 2023-11-20 14:51:26)468
- 替雷利珠单抗致免疫相关性糖尿病:病例报道与机制探讨,为临床用药敲响警钟( | 164点数解答 | 2024-10-11 14:52:52)271
- 解析React 15与Vue 2:从O(n^3)到O(n),Diff算法时间复杂度计算及性能对比 (阿里通义 | 379点数解答 | 2023-11-09 01:49:19)343
- 缜密逻辑,全新无名杀“风餐”技能代码精心打造与深度解析 (字节豆包 | 469点数解答 | 2025-04-05 11:37:06)249
- 精准优化:明确需求,开启高效提升之旅! (字节豆包 | 52点数解答 | 2026-02-09 16:44:46)47
- 代码再升级:优化版“获取dump”代码,多机制保障数据读取与保存(字节豆包 | 734点数解答 | 2026-02-10 01:23:31)72
- 代码深度优化:全面检查异常、灵活读取内存,提升可读性与可维护性(字节豆包 | 959点数解答 | 2026-02-10 01:24:14)39
- 大学生日常花销记账App开发:测试部署与后端开发工作全揭秘(百度文心 | 612点数解答 | 2024-05-15 18:59:38)356
- JS 代码:轻松定义变量 test 并赋值为“red”( | 6点数解答 | 2024-05-19 20:46:45)388
- JS 代码:轻松定义含“Saab、Volvo、BMW”的数组变量 mycars( | 14点数解答 | 2024-05-19 20:47:47)420
- JS 代码:判断“red”改值为“green”并弹窗显示结果( | 176点数解答 | 2024-05-20 21:33:04)421