昊昊爱运动
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行 每行两个数 l, r(1≤l≤r≤n);
Output
一共Q行
每一行输出一个数 表示昊昊在第l天到第r天一共做了多少种活动
Sample input and output
Sample Input | Sample Output |
---|---|
5 3 1 2 3 2 2 3 1 4 2 4 1 5 |
3 2 3 |
Source
第七届ACM趣味程序设计竞赛第二场(正式赛)
题目大意:
输入两个数N, M (1≤N≤2000, 1≤M≤100);
输入N个数ai表示在第i天昊昊做了第ai类型的运动;
输入一个数Q(1≤Q≤106);
输入Q行 每行两个数 l, r(1≤l≤r≤n);
输出一个数 表示昊昊在第l天到第r天一共做了多少种活动
题解:预处理,map
#include <stdio.h> #include <map> using namespace std; map<int,int>mp; int a[2010][2010]; int b[2016]; int main() { int n, m, i, j, q, l, r; scanf("%d%d", &n, &m); for(i=1;i<=n;i++) scanf("%d", &b[i]); for(i=1;i<=n;i++) { mp.clear(); for(j=i;j<=n;j++) { mp[b[j]]++; a[i][j]=mp.size(); } } scanf("%d", &q); while(q--) { scanf("%d%d", &l, &r); printf("%d ", a[l][r]); } return 0; }