标签:with 包括 print std res 代码 name math open
题意:给你一个数组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 }
Codeforces #637 div2 B. Nastya and Door
标签:with 包括 print std res 代码 name math open
原文地址:https://www.cnblogs.com/lr599909928/p/12771050.html