给定长度为 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 个宝石中,一共有多少种不同的魔法印记。现在小艾意了识了不按照魔法印记规律排序的坏处,以后一定会好好整理,但这次时间紧迫,还请你帮助他先回答导师的问题。
第一行有两个整数 n 和 m ,分别表示宝石的个数和导师给出的坐标个数。
第二行有 n 个整数 a1,a2,…,an ,表示这 n 个宝石的魔法印记种类。
接下来有 m 行,第 i 行有一个整数 bi(1≤bi≤n) ,表示导师给出的某一个位置。
1≤n,m≤100000,1≤ai≤100000
输出 m 行,每行一个整数,第 i 行的整数表示从第 bi 个宝石到第 n 个宝石中,一共有多少种不同的魔法印记。
输入
7 4
2 4 2 6 8 4 10
2
4
5
7
输出
5
4
3
1
说明
从第 2 块宝石到第 7 块宝石,对应的魔法印记序列为:4,2,6,8,4,10 ; 一共有 5 种印记。
以此类推
从第 7 块宝石到第 7 块宝石,对应的魔法印记序列为:10 ;一共只有 1 种印记。