Codeforces Round #637 (Div. 2) B Nastya and Door(前缀和优化)

地址:http://codeforces.com/contest/1341

     题意:找出含有山峰数最多区间的最左端点。

     解析:一开始读错了,区间两边如果是peak的话是不能算的,要减去,我还以为是只看端点不是山峰的区间.....山峰数的话,用前缀和记录一下就好了,然后遍历的时候,减一下端点就行了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#include<cmath>
#include<queue>
typedef long long ll;
using namespace std;
const int maxn=2e5+10;
int a[maxn];
int vis[maxn];
int chec[maxn];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,k;
        cin>>n>>k;
        for(int i=0;i<n;i++)
            {
                cin>>a[i];
                vis[i]=0;
                chec[i]=0;
            }
        int ans=0;
        for(int i=1;i<n-1;i++)
        {
            if(a[i]>a[i-1]&&a[i]>a[i+1])
            {
                ans++;
                chec[i]=1;
            }
            vis[i]+=ans;
        }
        vis[n-1]=vis[n-2];
        int maxx=0,l;
        for(int i=n-1;i>=k-1;i--)
        {
            if(maxx<=vis[i]-vis[i-k+1]-chec[i]-chec[i-k+1])
            {
                maxx=vis[i]-vis[i-k+1]-chec[i]-chec[i-k+1];
                l=i-k+1;
            //    cout<<i<<"==="<<endl;
            }
        }
        cout<<maxx+1<<" "<<l+1<<endl;
    }
}
原文地址:https://www.cnblogs.com/liyexin/p/12776247.html