题意:
求长度为 k k k 的段使得其中山峰最多,找到 l l l 最小的一段。
对于每个山峰标记,然后以长度为 k k k 的一个窗口滑动,左边失去的后一个位置是山峰就 − 1 -1 −1 ,右边得到的前一个位置是山峰就 + 1 +1 +1 。然后找到最大值即可。
AC代码:
const int N = 2e5 + 10;
int n, m, k;
int ans1, ans2, res, tmp, cnt;
int a[N];
bool vis[N];
int main()
{
int t;
sd(t);
while (t--)
{
sdd(n, k);
mem(vis, 0);
rep(i, 1, n)
{
sd(a[i]);
}
rep(i, 2, n - 1)
{
if (a[i] > a[i - 1] && a[i] > a[i + 1])
vis[i] = 1;
}
cnt = 0;
rep(i, 1, k - 1)
{
if (vis[i])
cnt++;
}
ans1 = cnt;
ans2 = 1;
rep(i, k + 1, n)
{
if (vis[i - k + 1])
cnt--;
if (vis[i - 1])
cnt++;
if (ans1 < cnt)
{
ans1 = cnt;
ans2 = i - k + 1;
}
}
ans1++;
pdd(ans1, ans2);
}
return 0;
}