http://poj.org/problem?id=2823
基礎單調隊列。用STL的deque竟然TLE!!!無論c++還是g++。。。
而用數組做提交c++ac了,提交g++TLE不明白為啥這樣子
堆操作:先對尾部進行操作,以小根堆為例:當從尾部加入一個元素後,檢查前面時候有比他大的,有就刪除前面,而此元素就向前推進,直至沒有比它大的,沒有就直接塞入;
然後對隊列的頭進行操作:檢查下標是否滿足特定範圍之內,不滿足就刪除,最後取第一個就是當前結果。
以這題為例,操作一下這個流程,加深理解
1 3 -1 -3 5 3 6 7
隊列 輸出
1
1 3
-1(1,3均比-1大,所以刪除) -1
-3 -3
-3 5 -3
-3 3 -3
3 6(因為-3的下標已經超出範圍,所以要delete) 3
3 6 7 3
***********************************************************************我是分割線***********************************************************************
AC代碼:
#include <vector>#include <list>#include <map>#include <set>#include <queue>#include <string.h>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <limits.h>using namespace std;int lowbit(int t){return t&(-t);}int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}#define LL long long#define PI acos(-1.0)#define N 1000010#define MAX INT_MAX#define MIN INT_MIN#define eps 1e-8#define FRE freopen("a.txt","r",stdin)int Minq[N],Maxq[N];int index[N],que[N];int a[N];int n,m;void Min(){ int i,j,k; int head=1,tail=0; for(i=1;i<=n;i++){ while(head<=tail && que[tail]>a[i]) tail--; tail++; que[tail]=a[i]; index[tail]=i; if(i>=m){ while(index[head]<i-m+1) head++; Minq[i-m]=que[head]; } }}void Max(){ int i,j,k; int head=1,tail=0; for(i=1;i<=n;i++){ while(head<=tail && que[tail]<a[i]) tail--; tail++; que[tail]=a[i]; index[tail]=i; if(i>=m){ while(index[head]<i-m+1) head++; Maxq[i-m]=que[head]; } }}int main(){ while(scanf("%d%d",&n,&m)!=EOF){ int i,j,k; for(i=1;i<=n;i++) scanf("%d",&a[i]); Min(); printf("%d",Minq[0]); for(i=1;i<n-m+1;i++)printf(" %d",Minq[i]); printf("\n"); Max(); printf("%d",Maxq[0]); for(i=1;i<n-m+1;i++)printf(" %d",Maxq[i]); printf("\n"); } return 0;}
TLE代碼:
#include <vector>#include <list>#include <map>#include <set>#include <queue>#include <string.h>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <limits.h>using namespace std;int lowbit(int t){return t&(-t);}int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a>b?b:a;}#define LL __int64#define pi acos(-1)#define N 1000010#define INF INT_MAX#define eps 1e-8#define FRE freopen("a.txt","r",stdin)struct node{ int num; int id;};deque<node> dmin,dmax;int ans[N];int main(){ //FRE; int n,m; while(scanf("%d%d",&n,&m)!=EOF) { int i,j; int cnt=1; dmin.clear(); dmax.clear(); node p; int tot=0; while(n--) { scanf("%d",&p.num); while(!dmin.empty() && dmin.front().id<cnt-m+1)dmin.pop_front(); while(!dmin.empty() && dmin.back().num>p.num)dmin.pop_back(); while(!dmax.empty() && dmax.front().id<cnt-m+1)dmax.pop_front(); while(!dmax.empty() && dmax.back().num<p.num)dmax.pop_back(); p.id=cnt++; dmin.push_back(p); dmax.push_back(p); if(cnt>m) { a[tot++]=dmax.front().num; printf("%d ",dmin.front().num); } } printf("\n"); for(i=0;i<tot;i++)printf("%d ",a[i]); printf("\n"); } return 0;}