[Codeforces] Sereja and Suffixes
http://codeforces.com/problemset/problem/368/B
做出这道题 沙茶我好高兴啊.
想了好长时间= = 比赛快结束的时候突然开窍了, wa一次, 第二次ac,
总之, 一般这种比较密集的运算需求, 一个常见的思路, 就是预处理,
在输入的时候就打好一个从ai到an不重复数字个数的表, 时间复杂度如果用哈希的话, 差不多就是O(n).
#include <cstdio> #include <vector> #include <set> using namespace std; int an[100010] = {0}; int am[100010] = {0}; int c[100010] = {0}; int main() { int n = 0, m = 0; scanf("%d%d", &n, &m); set<int> s; c[n + 1] = 0; for (int i = 1; i <= n; ++i) { scanf("%d", &an[i]); } for (int i = n; i >= 1; --i) { if (s.count(an[i]) == 0) { s.insert(an[i]); c[i] = c[i + 1] + 1; //printf("-%d,%d,%d\n", i, c[i], an[i]); } else { c[i] = c[i + 1]; //printf("+%d,%d,%d\n", i, c[i], an[i]); } } for (int i = 1; i <= m; ++i) { scanf("%d", &am[i]); } //dfs(1, n); for (int i = 1; i <= m; ++i) { printf("%d\n", c[am[i]]); } return 0; }