这道题的测试组只有一组,可想而知这一组数据量会比较大,既然选择暴力干脆
建立一个res[]数组表示答案,res[i]表示k=i时的答案,有几点需要注意,直接暴力
是不行的,要带点技巧,1,因为要求连续序列所以没有重复元素set即可以实现,
2,当一个set里面没有重复元素时且max-min+1==序列长度时,res[max-min+1]++;
详细的见代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<set>
using namespace std;
int arr[10005];
int res[10005];
int main()
{
int n,m;
cin>>n>>m;
memset(res,0,sizeof(res));
for(int i=1;i<=n;i++)
scanf("%d",&arr[i]);
printf("Case #1:\n");
int k;
vector<int> key;
for(int i=1;i<=m;i++)
{
scanf("%d",&k);
key.push_back(k);
}
res[1]=n;
for(int i=1;i<=n;i++)
{
set<int> s;
s.insert(arr[i]);
int Max=arr[i],Min=arr[i];
for(int j=i+1;j-i+1<=1000&&j<=n;j++)
{
if(s.find(arr[j])==s.end())
{
s.insert(arr[j]);
Max=max(Max,arr[j]);
Min=min(Min,arr[j]);
if(Max-Min+1==j-i+1)
{
res[Max-Min+1]++;
}
}
else
break;
}
}
for(int i=0;i<key.size();i++)
{
printf("%d\n",res[key[i]]);
}
}