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 水就离谱fd

我们不妨用前缀和先处理一下 \(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;
}
posted @ 2021-12-15 22:05  Eason_AC  阅读(56)  评论(0)    收藏  举报