Nastya and Door
題意 給一個數列,有正有負沒有0,給定一段子段的長度,求出一段子段中ai-1<ai,ai>ai+1,的ai的個數最多的那個的開始的元素的下標和該段中所含的ai的個數+1的值。
一開始把題意搞錯了,瞎折騰半天。
思路 前綴和,f[i]表示以第i個結尾的元素之前的段所包含的ai的個數,f[i]-f[j]就是截取一段所包含的ai的個數,注意,f[i]-f[j+1],而不是f[i]-f[j],因爲從第j個截取,第j個就一定不是ai,但是他如果是ai,要在f[j+1]才表現出來,靠。。。。。。。。。。
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[200005];
int main()
{
int t;
scanf("%d",&t);
int n,k;
int fr1,fr2;
int fr3;
int ans;
int l=1;
while(t--)
{
memset(f,0,sizeof(f));
scanf("%d%d",&n,&k);
scanf("%d%d",&fr1,&fr2);
for(int i=3;i<=n;i++)
{
scanf("%d",&fr3);
if(fr2>fr1&&fr2>fr3) f[i]=f[i-1]+1;
else
{
f[i]=f[i-1];
}
fr1=fr2;
fr2=fr3;
}
/* for(int i=1;i<=n;i++)
{
printf("%d ",f[i]);
}
printf("\n");*/
ans=0;
l=1;
for(int i=k;i<=n;i++)
{
if(ans<f[i]-f[i-k+2])
{
ans=f[i]-f[i-k+2];
l=i-k+1;
}
}
printf("%d %d\n",ans+1,l);
}
return 0;
}