[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;
}

 

posted @ 2013-11-27 02:49  NextLife  阅读(315)  评论(0)    收藏  举报