CF1539B Love Song 题解
Content
有一个长度为 \(n\) 的字符串,仅由小写英文字母组成。假设字母 \(c\) 在字母表中排在第 \(x_c\) 个。现在有 \(q\) 组询问,每组询问给定 \(l,r\),求 \(\sum\limits_{i=l}^rx_{s_i}\)。
数据范围:\(1\leqslant n,q\leqslant 10^5\)。
Solution
这 Div.2B 还比 Div.2A 水就离谱
我们不妨用前缀和先处理一下 \(sum_i=\sum\limits_{j=1}^ix_{s_j}\),然后询问的时候就可以直接 \(\mathcal{O}(1)\) 得到结果了。像这种给定一个区间求区间某个什么权值加起来的和这种题目,一般都可用前缀和优化复杂度。
Code
string index = "abcdefghijklmnopqrstuvwxyz";
map<char, int> times; //用 map 方便映射
int sum[100007];
int main() {
int n = Rint, q = Rint;
string s; cin >> s;
F(int, i, 0, 25) times[index[i]] = i + 1;
F(int, i, 1, n) sum[i] = sum[i - 1] + times[s[i - 1]];
while(q--) {
int l = Rint, r = Rint;
println(sum[r] - sum[l - 1]);
}
return 0;
}