题解 | #舞萌时间到!#

舞萌时间到!

https://www.nowcoder.com/practice/cef5fe464ca54a10ba1b4374f423f09c

问题的核心是多次查询一个静态数组(将字符串转化为分数数组)在不同区间 内的元素之和。由于数据量较大(字符串长度可达 ,询问次数可达 ),如果对于每次询问都暴力遍历区间求和,会导致超时。

这是一个经典的区间求和问题。

因此,最优的解决方案是使用前缀和算法。

代码实现

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    string s;
    cin >> s;

    int n = s.size();
    vector<ll> prefix(n + 1);
    prefix[0] = 0;
    for (int i = 0; i < n; i++) {
        if (s[i] == 'P') {
            prefix[i + 1] = prefix[i] + 3;
        } else if (s[i] == 'p') {
            prefix[i + 1] = prefix[i] + 2;
        } else if (s[i] == 'G') {
            prefix[i + 1] = prefix[i] + 1;
        } else {
            prefix[i + 1] = prefix[i];
        }
    }

    int q;
    cin >> q;

    while (q--) {
        int l, r;
        cin >> l >> r;
        ll ans = prefix[r] - prefix[l - 1];
        cout << ans << endl;
    }
}
每日一题@牛客网 文章被收录于专栏

牛客网每日一题

全部评论

相关推荐

11-06 16:50
门头沟学院 Java
用微笑面对困难:word打字比赛二等奖的我,也要来凑合凑合
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务