1 条题解
-
1
要解决这个问题,我们需要找到一种高效的方法来选择操作区间,使得最终得分最大。以下是针对该代码的题解分析: 方法思路 该方法的核心思路是双指针遍历,结合前缀和数组来快速计算区间和。具体步骤如下: 前缀和数组:先计算前缀和数组 b,其中 b[i] 表示前 i 个元素的和,用于快速计算任意区间 [l, r] 的和(即 b[r+1] - b[l])。 双指针遍历:使用左指针 l 和右指针 r 分别从两端向中间遍历。当找到一对满足 s[l] = 'L' 且 s[r] = 'R' 的位置时,计算该区间的和并累加到总得分,然后移动两个指针;若不满足,则分别移动左指针或右指针,直到找到下一个可能的匹配。 这种方法的时间复杂度为 O(n)
#include <bits/stdc++.h> using namespace std; #define int long long void yy() { int n; cin >> n; int arr[n + 5]; int b[n + 5] = {0}; // 前缀和数组,b[i]表示前i个元素的和 for (int i = 1; i <= n; i++) { cin >> arr[i]; b[i] = arr[i] + b[i - 1]; // 计算前缀和 } char s[n + 5]; cin >> s; int l = 0, r = n - 1, sum = 0; while (l < r) { if (s[l] == 'L' && s[r] == 'R') { // 计算区间[l, r]的和并累加 sum += b[r + 1] - b[l]; l++; r--; } // 移动左指针,寻找下一个'L' if (s[l] != 'L') { l++; } // 移动右指针,寻找下一个'R' if (s[r] != 'R') { r--; } } cout << sum << '\n'; } signed main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); int t = 1; cin >> t; while (t--) { yy(); } return 0; }前缀和数组 b:通过一次遍历计算前缀和,使得后续任意区间和的计算时间复杂度为 O(1)。 双指针遍历:左指针 l 从左向右找 'L',右指针 r 从右向左找 'R'。当找到一对匹配的 'L' 和 'R' 时,计算该区间的和并累加到总得分,然后同时移动两个指针;若不匹配,则单独移动对应指针。 输入输出优化:使用 ios::sync_with_stdio(0) 和 cin.tie(0), cout.tie(0) 加速输入输出,确保在大规模数据下的性能。 该方法高效且简洁,能够满足题目中对时间复杂度和数据规模的要求。
信息
- ID
- 1177
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 122
- 已通过
- 24
- 上传者