1 条题解

  • 1
    @ 2025-11-3 17:12:11

    要解决这个问题,我们需要找到一种高效的方法来选择操作区间,使得最终得分最大。以下是针对该代码的题解分析: 方法思路 该方法的核心思路是双指针遍历,结合前缀和数组来快速计算区间和。具体步骤如下: 前缀和数组:先计算前缀和数组 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) 加速输入输出,确保在大规模数据下的性能。 该方法高效且简洁,能够满足题目中对时间复杂度和数据规模的要求。

    • 1

    信息

    ID
    1177
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    122
    已通过
    24
    上传者