1. 程式人生 > >51nod 1275 連續子段的差異

51nod 1275 連續子段的差異

dash 什麽 splay display 最小值 當我 ace gif isp

技術分享

分析:

1、首先是尺取,尺取到每一個區間,區間滿足這個條件,最大-最小<=k;

2、對於一個動態區間,怎麽維護他的最大值,最小值(的下標);——單調隊列;

  什麽時候刪掉頭結點呢? 當我找到了當前區間的上限;我需要尺取移動頭結點了;此時,單調隊列不用怕,只要這個頭不影響我的單調隊列,我就可以不用管;否則彈掉;

技術分享
 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int maxn = 50000 + 5;
 6 int a[maxn];
 7
8 9 int main() 10 { 11 int n,k; 12 scanf("%d%d",&n,&k); 13 for(int i=0;i<n;i++) 14 scanf("%d",&a[i]); 15 16 int ans = 0; 17 deque<int> Amin,Amax; //單調遞減隊列,單調遞增隊列 18 19 for(int i=0,j=0;i<n;i++) { 20 21 while(j<n) { 22
23 while(!Amin.empty()&&a[j]>=a[Amin.back()]) 24 Amin.pop_back(); 25 26 while(!Amax.empty()&&a[j]<=a[Amax.back()]) 27 Amax.pop_back(); 28 Amin.push_back(j); 29 Amax.push_back(j); 30 31 if
(a[Amin.front()]-a[Amax.front()]<=k) 32 j++; 33 else break; 34 } 35 ans+=(j-i); 36 37 if(Amin.front()==i) 38 Amin.pop_front(); 39 if(Amax.front()==i) 40 Amax.pop_front(); 41 42 } 43 printf("%d\n",ans); 44 45 return 0; 46 }
View Code

51nod 1275 連續子段的差異