昊昊喜欢运动
他N天内会参加M种运动(每种运动用一个[1,m]的整数表示)
舍友有Q个问题:昊昊第ll天到第rr天参加了多少种不同的运动
Standard Input
输入两个数N, M (1≤N≤2000, 1≤M≤100);
输入N个数ai
表示在第i天昊昊做了第ai类型的运动;
输入一个数Q(1≤Q≤106);
输入Q行 每行两个数 l, r(1≤l≤r≤n);
Standard Output
一共Q行
每一行输出一个数 表示昊昊在第l天到第r天一共做了多少种活动
Samples
Input
5 3
1 2 3 2 2
3
1 4
2 4
1 5
Output
3
2
3
这一题可以直接打表,求出所有l-r的情况,复杂度是O(n2);输出的复杂度是O(Q);总体应该不会超时;
但是这题一直TLE,苦思冥想后试着把cin改成了scanf就AC了
虽然知道cin的效率低于scanf,但是觉得2000组数据不算太大,不会有太大差异,然而事实是………………
所以我测了一下这俩玩意读一千万组数时的时间差异||||
#include<iostream>
#include<cstdio>
using namespace std;
#include<ctime>
#define N 10000000
int a[N];
int main()
{
clock_t start,end;
start=clock();
for(int i=0;i<N;i++)
cin>>a[i];
end=clock();
double t=(double)(end-start)/CLOCKS_PER_SEC;
cout<<"cin time: "<<t<<" s"<<endl;
start=clock();
for(int i=0;i<N;i++)
scanf("%d",a+i);
end=clock();
t=(double)(end-start)/CLOCKS_PER_SEC;
cout<<"scanf time: "<<t<<" s"<<endl;
return 0;
}
cin耗时39.987s ; scanf耗时4.77s 。
所以刷题时尽量用scanf读数据吧(哭死)
下面贴一下本题打表程序
#include <iostream>
#include<cstdio>
#include <cstring>
using namespace std;
#define N 2005
int a[N];
int ANS[N][N];
int vis[N];
int main()
{
int n, m;
scanf("%d %d",&n,&m);
int ans = 0;
for(int i = 1; i <= n; i++)
scanf("%d",a+i);
for(int i = 1; i <= n; i++)
{
memset(vis,0,sizeof(vis));
ans = 0;
for(int j = i; j <= n; j++)
{
if(vis[a[j]]==0)
{
ans++;
vis[a[j]]++;
}
ANS[i][j] = ans;//第i天到第j天的种数
}
}
int l, r, Q;
cin>>Q;
while(Q--)
{
scanf("%d %d",&l,&r);
cout<<ANS[l][r]<<endl;
}
return 0;
}
每一个蒟蒻的去世,没有哪一个神犇是无辜的哈哈哈哈哈