Codeforces #637 div2 B. Nastya and Door

题意:给你一个数组a,定义:若a[i]>a[i]&&a[i]>a[i-1],则a[i]为峰值,求长度为k的区间内峰值最多能为多少,并输出这个区间的左端点(区间需要将峰的左边和右边都包括)

题解:记录每个峰值,然后搞一个后缀和,从前往后枚举长度为k的区间,每次维护一下最多的峰值和区间位置即可.

         tips:注意边界,区间左端点l要初始化成1(我初始化的是0,wa了一整场~(>_<)~)

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <stack>
 7 #include <queue>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <unordered_set>
12 #include <unordered_map>
13 #define ll long long
14 #define fi first
15 #define se second
16 #define pb push_back
17 #define me memset
18 const int N = 1e6 + 10;
19 const int mod = 1e9 + 7;
20 using namespace std;
21 typedef pair<int,int> PII;
22 typedef pair<long,long> PLL;
23  
24 int t;
25 int n,k,a[N];
26 map<int,int> top,pre;
27 int main() {
28     ios::sync_with_stdio(false);
29     cin>>t;
30      while(t--){
31          cin>>n>>k;
32          top.clear();
33          pre.clear();
34           for(int i=1;i<=n;++i) cin>>a[i];
35           for(int i=2;i<n;++i){
36               if(a[i]>a[i-1] && a[i]>a[i+1]){
37                   top[i]=1;
38                   pre[i]=1;
39               }
40           }
41           for(int i=n+k;i>=1;--i) pre[i]=pre[i+1]+pre[i];
42           int res=0,pos=1;
43           for(int i=1;i<=n;++i){
44               int tmp=pre[i]-pre[i-1+k]-top[i];
45               if(tmp>res){
46                   res=tmp;
47                   pos=i;
48               }
49           }
50           printf("%d %d\n",res+1,pos);
51      }
52     return 0;
53 }
View Code

猜你喜欢

转载自www.cnblogs.com/lr599909928/p/12771050.html