zoukankan      html  css  js  c++  java
  • cdoj 1256 昊昊爱运动 预处理/前缀和

    昊昊爱运动

    Time Limit: 20 Sec

    Memory Limit: 256 MB

    题目连接

    http://acm.uestc.edu.cn/#/problem/show/1256

    Description

    昊昊喜欢运动

    N天内会参加M种运动(每种运动用一个[1,m]的整数表示)

    舍友有Q个问题

    问昊昊第l天到第r天参加了多少种不同的运动

    Input

    输入两个数NM (1N20001M100);

    输入N个数ai表示在第i天昊昊做了第ai类型的运动;

    输入一个数Q(1Q106);

    输入Q行 每行两个数 lr(1lrn);

    Output

    一共Q

    每一行输出一个数 表示昊昊在第l天到第r天一共做了多少种活动

    Sample Input

    5 3
    1 2 3 2 2
    3
    1 4
    2 4
    1 5

    Sample Output

    3
    2
    3

    HINT

    题意

    题解:

    正解有两种

    1.n^2预处理

    由于n只有2000,我们可以n^2去预处理出答案,然后对于每次询问我们都O(1)回答
    核心代码:
    for (i=0;i<n;i++){
    memset(f,0,sizeof(f) );
    x=0;
    for (j=i;j<n;j++){
    if ( f[a[j] ]==0 ) { f[a[j] ]=1; x++;}
    ans[i][j]=x;
    }
    }

    2.前缀和思想
    我们去维护sum[i][j],表示[1,i]中,j究竟出现了多少次。
    然后对于每一次询问,我们只要扫一遍m,判断sum[r][i]-sum[l-1][i]是否大于0就好了
    这样预处理的复杂度是O(n),对于每一个询问的复杂度是O(m)
    所以总体复杂度是O(n+qm)

    代码:

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int n,m,i,tmp,j,Q,l,r,ans,a[2005][105];
    int main(){
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;++i){
            scanf("%d",&tmp);
            a[i][tmp]=1;
            for(j=1;j<=m;++j)a[i][j]+=a[i-1][j];
        }
        scanf("%d",&Q);
        for(i=1;i<=Q;++i){
            scanf("%d%d",&l,&r);
            ans=0;
            for(j=1;j<=m;++j)ans+=(a[r][j]>a[l-1][j]);
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    git撤销远程commit
    git撤销add
    tf.train.AdamOptimizer 优化器
    tf.train.MomentumOptimizer 优化器
    tf.train.GradientDescentOptimizer 优化器
    tf.nn.top_k
    tf.nn.sigmoid_cross_entropy_with_logits 分类
    tf.nn.softmax 分类
    tf.nn.softmax_cross_entropy_with_logits 分类
    Python可迭代序列排序总结
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5023303.html
Copyright © 2011-2022 走看看