题意:给你一个序列,问你从l位置到结尾有多少个不同的数字。
水题,设dp[i]表示从i位置到结尾不同数字的个数,那么dp[i] = dp[i+1] + (vis[a[i]] == 0),在O(n)时间内得出答案。
#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int MAXN = 100010; int vis[MAXN], dp[MAXN], a[MAXN]; int main(){ int n, m, l; #ifndef ONLINE_JUDGE freopen("in.cpp", "r", stdin); #endif while(~scanf("%d%d", &n, &m)){ memset(dp, 0, sizeof dp); memset(vis, 0, sizeof vis); for(int i = 1;i <= n;i ++) scanf("%d", a + i); dp[n] = 1, vis[a[n]] = 1; for(int i = n-1;i > 0;i --){ if(!vis[a[i]]){ dp[i] = dp[i+1] + 1; vis[a[i]] = 1; }else dp[i] = dp[i+1]; } for(int i = 0;i < m;i ++){ scanf("%d", &l); printf("%d ", dp[l]); } } return 0; }