Codeforces #637 div2 B. Nastya and Door

Posted lr599909928

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
",res+1,pos);
51      }
52     return 0;
53 }
View Code

 

以上是关于Codeforces #637 div2 B. Nastya and Door的主要内容,如果未能解决你的问题,请参考以下文章

codeforces #369div2 B. Chris and Magic Square

CodeForces #362 div2 B. Barnicle

Codeforces Round #637 (Div. 2)

[刷题codeforces]650A.637A

Codeforces Round #637 (Div. 2)

#419(div2) B. Karen and Coffee