给定长度为 n 的数组 a[1..n](表示每块宝石的魔法印记种类),以及 m 个位置 b_i。问题是:对每个查询位置 b_i,询问从第 b_i 个宝石到第 n 个宝石这一段中,不同印记的种类数。
这是典型的“后缀不同元素计数”问题。
做法:从右向左遍历数组,维护一个“是否出现过”的集合(或布尔数组/哈希表)。若 a[i] 是第一次出现,则种类计数 cnt++。用数组 f[i] 记录从位置 i 到末尾的不同种类总数。遍历结束后,对于每个查询 b_i,直接输出 f[b_i] 即可。
相关算法:
在一片神秘的魔法森林中隐藏着许多珍贵的魔法宝石。每个宝石都蕴含着一种魔法印记,用一个正整数 a 表示。探险家小艾挖掘出了 n 个宝石,把它们随意的摆放到桌子上并从左到右依次编号为 1 ~ n ,对应的宝石魔法印记种类记为 a1,a2,...,an ,小艾的导师认为随意摆放宝石是一个很不好的习惯,所以他想考考小艾。
导师给出 m 个位置 b1,b2,...,bm(1≤bi≤n) 。
对于每一个位置 b,导师想知道从第 bi 个宝石到第 n 个宝石中,一共有多少种不同的魔法印记。现在小艾意了识了不按照魔法印记规律排序的坏处,以后一定会好好整理,但这次时间紧迫,还请你帮助他先回答导师的问题。