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

输入两个数N, M (1≤N≤2000, 1≤M≤100);

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

输入一个数Q(1≤Q≤106);

输入Q行 每行两个数 l, r(1≤l≤r≤n);

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\n",ans);
    }
    return 0;
}
时间: 2024-10-14 14:08:32

cdoj 1256 昊昊爱运动 预处理/前缀和的相关文章

cdoj 1256 昊昊爱运动 预处理

昊昊爱运动 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 昊昊喜欢运动 他NN天内会参加MM种运动(每种运动用一个[1,m][1,m]的整数表示) 舍友有QQ个问题 问昊昊第ll天到第rr天参加了多少种不同的运动 Input 输入两个数NN, MM (1≤N≤20001≤N≤2000, 1≤M≤1001≤M≤100); 输入NN个数aiai表示在第i天昊昊做了第aiai类型的

UESTC 1256 昊昊爱运动 Map

昊昊爱运动 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 昊昊喜欢运动 他N天内会参加M种运动(每种运动用一个[1,m]的整数表示) 舍友有QQ个问题 问昊昊第l天到第r天参加了多少种不同的运动 Input 输入两个数N, M (1≤N≤2000, 1≤M≤100); 输入N个数ai表示在第i天昊昊做了第ai类型的运动; 输入一个数Q(1≤Q≤106); 输入Q行 每行两个数

CDOJ 1259 昊昊爱运动 II 线段树+bitset

昊昊爱运动 II 昊昊喜欢运动 他N天内会参加M种运动(每种运动用一个[1,m]的整数表示) 现在有Q个操作,操作描述如下 昊昊把第l天到第r天的运动全部换成了x(x∈[1,m]) 问昊昊第l天到第r天参加了多少种不同的运动 Input 输入两个数N, M (1≤N≤105, 1≤M≤100); 输入N个数ai(ai∈[1,m])表示在第i天昊昊做了第ai类型的运动; 输入一个数Q(1≤Q≤105); 输入Q行 每行描述以下两种操作 形如M l r x,表示昊昊把第l天到第r天的运动全部换成了x

CDOJ 1259 昊昊爱运动 II bitset+线段树

题目链接 昊昊喜欢运动 他N天内会参加M种运动(每种运动用一个[1,m]的整数表示) 现在有Q个操作,操作描述如下 昊昊把第l天到第r天的运动全部换成了x(x∈[1,m]) 问昊昊第l天到第r天参加了多少种不同的运动 Input 输入两个数N, M (1≤N≤105, 1≤M≤100); 输入N个数ai(ai∈[1,m])表示在第i天昊昊做了第ai类型的运动; 输入一个数Q(1≤Q≤105); 输入Q行 每行描述以下两种操作 形如M l r x,表示昊昊把第l天到第r天的运动全部换成了x(x∈[

UESTC-1259 昊昊爱运动 II

昊昊爱运动 II Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 昊昊喜欢运动 他N天内会参加M种运动(每种运动用一个[1,m]的整数表示) 现在有Q个操作,操作描述如下 昊昊把第l天到第r天的运动全部换成了x(x∈[1,m]) 问昊昊第l天到第r天参加了多少种不同的运动 Input 输入两个数N, M (1≤N≤105, 1≤M≤100); 输入N个数ai(ai∈[1,m])

CDOJ 1256 二维前缀和处理

昊昊喜欢运动 他NN 天内会参加MM 种运动(每种运动用一个[1,m][1,m] 的整数表示) 舍友有QQ 个问题 问昊昊第ll 天到第rr 天参加了多少种不同的运动 Input 输入两个数NN , MM (1≤N≤20001≤N≤2000 , 1≤M≤1001≤M≤100 ); 输入NN 个数aiai 表示在第i天昊昊做了第aiai 类型的运动; 输入一个数QQ (1≤Q≤1061≤Q≤106 ); 输入QQ 行 每行两个数 ll , rr (1≤l≤r≤n1≤l≤r≤n ); Output

BZOJ 3704(昊昊的机油之GRST-维护构造贪心解)

3704: 昊昊的机油之GRST Time Limit: 10 Sec  Memory Limit: 1024 MB Submit: 47  Solved: 15 [Submit][Status] Description 昊昊有个好机油,他就是传说中的着力点.现在昊昊获得了一份长度为n的GRST牌(mod 4 意义下),打算作为送给好机油的生日礼物(不是在2月的么).但是,昊昊深知他的机油是个神犇,作为数字控的他,只会喜欢特定的序列.但是昊昊不怕,他可以使用一次菲亚特(他的机油最喜欢的大招),将

二分 + 预处理前缀后缀 技巧题

You are given two strings a and b. You have to remove the minimum possible number of consecutive (standing one after another) characters from string b in such a way that it becomes a subsequence of string a. It can happen that you will not need to re

小鑫爱运动

题目描述 小鑫非常喜欢运动,有一次小鑫去参加110米栏的比赛,一共有10名比赛选手,小鑫是1号,由于跑的太专注,最后冲线的时候不知道自己是第几名,只知道每个人最后的成绩,聪明的你可不可以帮帮他? 输入 多组输入. 先输入一个10, 然后每组输入10个整数,代表10个选手的110米栏成绩m,代表1号到N号的N个选手的成绩m,m范围是(0 < m < 100). 输出 输出只有一行,代表小鑫最后的名次是多少. 因为小鑫长得比较丑,所以如果成绩相同的情况下,小鑫都会排在前面. 示例输入 10 2 5