zoukankan      html  css  js  c++  java
  • CodeForces 368B Sereja and Suffixes

    题意:给你一个序列,问你从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;
    }


  • 相关阅读:
    宏观经济指标
    线程与进程 concurrent.futures模块
    python 进程和线程(2)
    进程和线程(1)
    C++学习
    原则阅读笔记
    python类(3)感悟
    python类(2)
    打新股技巧
    python连接数据库
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3933138.html
Copyright © 2011-2022 走看看