题目:小明有一个花园,花园里一共有m朵花,对于每一朵花,都是不一样的,小明用1~m中的一个整数表示每一朵花,他很喜欢去看花,有一天他看了n次,并将n次他看花的种类是什么按照时间顺序记录下来。记录用a[i]表示,表示第i次他看了a[i]这朵花。小红很好奇,她有Q个问题,问(l,r)的时间内,小明一共看了多少朵不同的花儿。
输入:
- 输入两个数n,m(1=<n<=2000,1=<m=<100):分别表示n次看花,m表示一共有m朵花儿
- 输入n个数a[1]~a[n],a[i]表示第i次,小明看的花的种类
- 输入一个数Q(1=<Q=<1000000),表示小红的问题数量
- 输入Q行,每行两个数(r(1=<l=<r=<n))表示小红想知道在第l次到第r次,小明一共看了多少不同的花
输出:
- 一共Q行
- 每一行输出一个数,表示小明在(l,r)的时间内看了多少种花
样例输入:
5 3
1 2 3 2 2
3
1 4
2 4
1 5
样例输出:
3
2
3
代码:
代码用的是最粗暴的方法,而且数据类型被我定义成了int,实际上也有很大的问题,因为n、m、甚至是Q,都是很大的值(最大的为1000000),所以最好将数据类型定义为long long型。。。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<vector>
#include<map>
using namespace std;
int main()
{
int n, m;
cout << "请输入看花的次数n和花的种类m:";
cin >> n >> m;
vector<int> array(n);
int i,j;
cout << "请输入n次看花的花的种类:";
for (i = 0; i < n; i++)
cin >> array[i];
//for (i = 0; i < n; i++)
//cout << array[i];
int Q;
cout << "请输入小红的问题个数:";
while (scanf("%d", &Q) != EOF)
{
vector<vector<int>> nQ(Q, vector<int>(2));
cout << "请输入小红的问题:";
for (i = 0; i < Q; i++)
{
for (j = 0; j < 2; j++)
scanf("%d", &nQ[i][j]);
}
int left, right;
map<int, int> item;
for (i = 0; i < Q; i++)
{
left = nQ[i][0];
right = nQ[i][1];
cout << left << right << endl;
for (j = left-1; j < right; j++)
{
//cout << left << right << endl;
cout << j << " ";
cout << "array[j]:"<<array[j]<<endl;
item[array[j]]++;
}
cout << "result:";
cout << item.size() << endl;
item.clear();
}
}
}