题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5247
分析:这道题是2015百度之星初赛1的2题,当时没看这道题
是队友看的,比完以后也做了一下,思路大体都是一样的,就是
暴力枚举,因为k<=1000,那么我们可以每一点x为起点跑[x,x+999]
这段区间,把每得到一段连续的子区间[x,?],则num[len]++(len=size([x,?]));
这样就可以了,最后num数组里就是对应的答案
献上代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<set>
using namespace std;
const int maxn=10000+10;
int num[maxn],sum[maxn];
int main()
{
int n,m,k,t=0;
while(~scanf("%d%d",&n,&m))
{
// scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
memset(sum,0,sizeof(sum));
sum[1]=n;
for(int i=0;i<n;i++)
{
int Min,Max;
Min=Max=num[i];
set<int>st;
st.insert(num[i]);
for(int j=1;j<1000&&i+j<n;j++)
{
st.insert(num[i+j]);
Min=min(Min,num[i+j]);
Max=max(Max,num[i+j]);
if(j+1!=st.size())
break;
if(Max-Min==j)
sum[j+1]++;
}
}
printf("Case #%d:\n",++t);
while(m--)
{
scanf("%d",&k);
printf("%d\n",sum[k]);
}
}
return 0;
}