亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

POJ 2823 Sliding Window (單調隊列的學習)

2019-11-14 12:17:56
字體:
來源:轉載
供稿:網友
An array of size n ≤ 10 6 is given to you. There is a sliding window of size kwhich is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves rightwards by one position. Following is an example: The array is [1 3 -1 -3 5 3 6 7], and k is 3.
Window positionMinimum valueMaximum value
[1  3  -1] -3  5  3  6  7 -13
 1 [3  -1  -3] 5  3  6  7 -33
 1  3 [-1  -3  5] 3  6  7 -35
 1  3  -1 [-3  5  3] 6  7 -35
 1  3  -1  -3 [5  3  6] 7 36
 1  3  -1  -3  5 [3  6  7]37

Your task is to determine the maximum and minimum values in the sliding window at each position. 

InputThe input consists of two lines. The first line contains two integers n and k which are the lengths of the array and the sliding window. There are n integers in the second line. OutputThere are two lines in the output. The first line gives the minimum values in the window at each position, from left to right, respectively. The second line gives the maximum values. Sample Input
8 31 3 -1 -3 5 3 6 7Sample Output
-1 -3 -3 -3 3 3

3 3 5 5 6 7

題目大意:給你一個數組,然后讓從左到右,找到每連續k個數的最大值和最小值并且輸出

題目分析:單調隊列解決,然后用C++卡時間AC,用G++會超時

這個問題相當于一個數據流(數列a)在不斷地到來,而數據是不斷過期的,相當于我們只能保存有限的數據(sliding window中的數據,此題中就是窗口的寬度w),對于到來的查詢(此題中查詢是每時刻都有的),我們要返回當前滑動窗口中的最大值/最小值。注意,元素是不斷過期的。

解決這個問題可以使用一種叫做單調隊列的數據結構,它維護這樣一種隊列:

a)從隊頭到隊尾,元素在我們所關注的指標下是遞減的(嚴格遞減,而不是非遞增),比如查詢如果每次問的是窗口內的最小值,那么隊列中元素從左至右就應該遞增,如果每次問的是窗口內的最大值,則應該遞減,依此類推。這是為了保證每次查詢只需要取隊頭元素。

b)從隊頭到隊尾,元素對應的時刻(此題中是該元素在數列a中的下標)是遞增的,但不要求連續,這是為了保證最左面的元素總是最先過期,且每當有新元素來臨的時候一定是插入隊尾。

滿足以上兩點的隊列就是單調隊列,首先,只有第一個元素的序列一定是單調隊列。

那么怎么維護這個單調隊列呢?無非是處理插入和查詢兩個操作。

對于插入,由于性質b,因此來的新元素插入到隊列的最后就能維持b)繼續成立。但是為了維護a)的成立,即元素在我們關注的指標下遞減,從隊尾插入新元素的時候可能要刪除隊尾的一些元素,具體說來就是,找到第一個大于(在所關注指標下)新元素的元素,刪除其后所有元素,并將新元素插于其后。因為所有被刪除的元素都比新元素要小,而且比新元素要舊,因此在以后的任何查詢中都不可能成為答案,所以可以放心刪除。

對于查詢,由于性質b,因此所有該時刻過期的元素一定都集中在隊頭,因此利用查詢的時機刪除隊頭所有過期的元素,在不含過期元素后,隊頭得元素就是查詢的答案(性質a),將其返回即可。

由于每個元素都進隊出隊一次,因此攤銷復雜度為O(n)。

程序實現過程中先將前k個元素入隊,此后每次在隊尾加入a[k+1...n],在插入元素中同時進行以下操作:

1、將隊尾所有大于a[i]的值彈出隊列

2、插入a[i]到隊尾

3、判斷隊首元素位置是否超出i-k

注意:

1、在更新隊列元素時要同時記錄該元素在原數據的位置

2、在進行操作1時要用二分優化(可以用C++編譯器卡時間AC,但換成G++和GCC就會TLE)

#include <iostream>#include <fstream>#define maxn 1000010using namespace std;int a[maxn],q[maxn],p[maxn],Min[maxn],Max[maxn],n,k;// a是數據,q是隊列,p是存放下標void gmin(){	int tail=0,head=1,i;	for(i=0;i<k-1;i++){		while(head<=tail && q[tail]>=a[i])//若添加的元素小于隊尾元素,符合條件,刪除隊尾元素,直到隊尾元素小于此元素為止 		  --tail;		q[++tail]=a[i];//存放滿足條件的數據 		p[tail]=i;//記錄存儲的數據下標,保證每個窗口所讀入的數據都在k的范圍內 	}	for(;i<n;i++){		while(head<=tail && q[tail]>=a[i])		 --tail;		q[++tail]=a[i];		p[tail]=i;		while(p[head]<i-k+1)//利用查看數據是否過時,即是否在窗口內 		  ++head;	   Min[i-k+1]=q[head];//存放數據答案 	}} void gmax(){	int tail=0,head=1,i;	for(i=0;i<k-1;i++){		while(head<=tail && q[tail]<=a[i])		  --tail;		q[++tail]=a[i];		p[tail]=i;	}	for(;i<n;i++){		while(head<=tail && q[tail]<=a[i])		  --tail;		q[++tail]=a[i];		p[tail]=i;		while(p[head]<i-k+1)		   head++;		Max[i-k+1]=q[head];	}}	void output(){	for(int i=0;i<n-k;i++)	   PRintf("%d ",Min[i]);	   printf("%d/n",Min[n-k]);	for(int i=0;i<n-k;i++)	   printf("%d ",Max[i]);	   printf("%d/n",Max[n-k]);}int main(){	scanf("%d%d",&n,&k);	for(int i=0;i<n;i++)	  scanf("%d",&a[i]);	gmin();	gmax();	output();	return 0;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产91精品久久久久久久| 亚洲国产精品久久久久| 欧美高清在线播放| 国产一区二区三区四区福利| 国产亚洲aⅴaaaaaa毛片| 国产精品白丝jk喷水视频一区| 亚洲缚视频在线观看| 国产精品∨欧美精品v日韩精品| 91免费版网站入口| 午夜精品在线观看| 国产精国产精品| 狠狠躁夜夜躁人人躁婷婷91| 成人性教育视频在线观看| 久久久精品国产一区二区| 亚洲午夜久久久影院| 高跟丝袜一区二区三区| 色777狠狠综合秋免鲁丝| 欧美性在线视频| 91夜夜揉人人捏人人添红杏| 成人精品久久av网站| 色噜噜狠狠狠综合曰曰曰88av| 国产国产精品人在线视| 国产精品99久久久久久白浆小说| 美日韩丰满少妇在线观看| 久久精品国产视频| 高清日韩电视剧大全免费播放在线观看| 国产亚洲欧洲高清| 国色天香2019中文字幕在线观看| 亚洲电影成人av99爱色| 亚洲一级免费视频| 日韩av免费在线| 色婷婷av一区二区三区久久| 国产精品日韩在线观看| 亚洲视频axxx| 欧美电影在线观看| 日韩精品在线视频| 久久人人97超碰精品888| 国产精品h在线观看| 精品久久香蕉国产线看观看gif| 97在线免费观看| 日韩在线播放视频| 欧洲亚洲免费在线| 亚洲天堂成人在线视频| 国产91精品在线播放| 国产成人综合久久| 亚洲精品国产精品久久清纯直播| 欧美大片在线看| 亚洲欧美色图片| 久久久久免费精品国产| 91老司机精品视频| 国自产精品手机在线观看视频| 亚洲精品一区二三区不卡| 亚洲黄色av网站| 精品久久久久久中文字幕| 裸体女人亚洲精品一区| 亚洲国产精品一区二区久| 精品国产欧美一区二区五十路| 日韩av在线影视| 国产成人激情视频| 亚洲最大福利网| 亚洲字幕一区二区| 色狠狠久久aa北条麻妃| 不用播放器成人网| 日韩av免费在线看| 国产精欧美一区二区三区| 久久成人免费视频| 欧美一区三区三区高中清蜜桃| 国产精品网站大全| 亚洲影院色无极综合| 日韩精品免费在线视频| 日本精品久久久久久久| 欧美刺激性大交免费视频| 亚洲高清免费观看高清完整版| 亚洲欧美国产精品| 久久91亚洲人成电影网站| 日韩毛片在线观看| 中文字幕精品—区二区| 在线电影欧美日韩一区二区私密| 欧美黄色片免费观看| 精品国产31久久久久久| 中文字幕成人精品久久不卡| 午夜精品久久久久久久99热| 欧美日韩在线视频首页| 中文字幕亚洲在线| 成人看片人aa| 亚洲激情视频在线观看| 国产精品老女人视频| 成人午夜两性视频| 亚洲娇小xxxx欧美娇小| 91大神福利视频在线| 中文日韩电影网站| 91精品视频一区| 成人中文字幕+乱码+中文字幕| 久久精品成人欧美大片| 538国产精品一区二区免费视频| www亚洲精品| 一个人看的www久久| www.亚洲一二| 欧美精品一区二区三区国产精品| 97国产在线观看| 亚洲人成网站免费播放| 色综合老司机第九色激情| 色偷偷av一区二区三区| 欧美久久久精品| 国产精品国语对白| 欧美日韩国产丝袜另类| 国产成人精品综合久久久| 欧美日韩精品二区| 欧美极品少妇与黑人| 91久久国产婷婷一区二区| 91最新在线免费观看| 国产一区二区三区免费视频| 海角国产乱辈乱精品视频| 91在线视频免费| 精品视频一区在线视频| 在线精品视频视频中文字幕| 久久久精品久久久久| 成年无码av片在线| 亚洲欧美日韩天堂一区二区| 久久久久久国产三级电影| 欧美成人精品三级在线观看| 黄色一区二区在线观看| 亚洲美女av在线| 国产一区二区精品丝袜| 日本不卡高字幕在线2019| 亚洲第一av在线| 亚洲精品成人久久电影| 亚洲国产精品yw在线观看| 国产精品福利在线观看| 国产小视频91| 亚洲小视频在线| 国产精品入口免费视频一| 欧美性xxxx极品hd满灌| 精品亚洲精品福利线在观看| 色多多国产成人永久免费网站| 久久综合88中文色鬼| 精品国产91久久久久久老师| 97久久超碰福利国产精品…| 色综合91久久精品中文字幕| 亚洲a区在线视频| 亚洲天堂免费在线| 蜜臀久久99精品久久久久久宅男| 精品偷拍一区二区三区在线看| 国产精品久久久久久久久久小说| 亚洲91av视频| 日本成人精品在线| 国产精品日韩在线一区| 日韩视频在线免费| 亚洲三级 欧美三级| 最新69国产成人精品视频免费| 成人在线中文字幕| 国产精品久久9| 国外成人性视频| 成人黄色av播放免费| 亚洲欧美日韩综合| 亚洲欧美变态国产另类| 美乳少妇欧美精品| 91视频九色网站| 91高清在线免费观看| 国产美女精品视频| 久久全国免费视频| 国产精品视频网址| 日韩性生活视频| 亚洲亚裔videos黑人hd|