#include <iostream>
#include <cstdio>
using namespace std;
bool bo[100004]={0};
int a[100003];
int f[100030]={0};
int n,m;
int read()
{
int neko=0,fu=1;
char para=getchar();
if(para =='-')fu=-1;
while(para<'0'||para>'9')para=getchar();
while(para>='0'&¶<='9')
{
neko=neko*10+para-'0';
para=getchar();
}
return neko *fu;
}
int main()
{
//freopen("suffixes.in","r",stdin);
//freopen("suffixes.out","w",stdout);
n=read();m=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=n;i>=1;i--)
{
if(!bo[a[i]])
{
bo[a[i]]=1;
f[i]=f[i+1]+1;
}
else f[i]=f[i+1];
}
for(int i=1;i<=m;i++)
{
int q=read();
printf("%d\n",f[q]);
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
输入文件:suffixes.in
输出文件:suffixes.out
时间限制:1S
空间限制:256M
题目描述
n 个数按顺序排成一排,m 个询问,每次询问第 x 个数到第 n 个数共有多少个不同的数。
输入格式
第一行输入 n,m
第二行输入 n 个数表示数列
接下来 m 行,每行一个数表示询问
输出格式
输出共 m 行表示每个询问的答案
样例输入
10 10
1 2 3 4 1 2 3 4 100000 99999
1
2
3
4
5
6
7
8
9
10
样例输出
6
6
6
6
6
5
4
3
2
1
数据范围和约定
对于 20%的数据,1<=n,m<=10
对于 50%的数据,1<=n,m<=10^3
对于 100%的数据,1<=n,m<=10^5,1<=每个数的值<=10^5
这是一道水题,开个布尔数组倒序模拟一遍就好。。
2019.8.11更新:
几年之后重新看自己当初的博客,发现自己都看不懂这个题解,所以补充一些东西
这是一次动规相关测试的t1,难度偏低。初看可以想到倒序枚举每一个数字查重,但显然时间复杂度很高。但是他提供了数字的范围,由于数字不大,我们可以利用类似桶排序的思想,开一个10^5的布尔数组用于查重,接下来就是一个简单的线性动规即可