51nod 1275 連續子段的差異
阿新 • • 發佈:2017-05-03
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]; 7View Code8 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) { 2223 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 }
51nod 1275 連續子段的差異