地址: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; } }