Codeforces 1341 B. Nastya and Door
程序员文章站
2022-06-08 15:54:10
...
题意:
求长度为 的段使得其中山峰最多,找到 最小的一段。
对于每个山峰标记,然后以长度为 的一个窗口滑动,左边失去的后一个位置是山峰就 ,右边得到的前一个位置是山峰就 。然后找到最大值即可。
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;
}