洛谷 P1886 滑动窗口
題目描述
現(xiàn)在有一堆數(shù)字共N個(gè)數(shù)字(N<=10^6),以及一個(gè)大小為k的窗口?,F(xiàn)在這個(gè)從左邊開(kāi)始向右滑動(dòng),每次滑動(dòng)一個(gè)單位,求出每次滑動(dòng)后窗口中的最大值和最小值。
例如:
The array is [1 3 -1 -3 5 3 6 7], and k = 3.
輸入輸出格式
輸入格式:
?
輸入一共有兩行,第一行為n,k。
第二行為n個(gè)數(shù)(<INT_MAX).
?
輸出格式:
?
輸出共兩行,第一行為每次窗口滑動(dòng)的最小值
第二行為每次窗口滑動(dòng)的最大值
?
輸入輸出樣例
輸入樣例#1:8 3 1 3 -1 -3 5 3 6 7 輸出樣例#1:
-1 -3 -3 -3 3 3 3 3 5 5 6 7
說(shuō)明
50%的數(shù)據(jù),n<=10^5
100%的數(shù)據(jù),n<=10^6//第一次數(shù)組只開(kāi)到十萬(wàn),才有60分(不是說(shuō)50分的嗎)
解題思路
一道RMQ裸題,做法很多,我用的是單調(diào)隊(duì)列。單調(diào)隊(duì)列跑兩遍,分別求出區(qū)間最大值、區(qū)間最小值(其實(shí)不用記錄答案統(tǒng)一輸出的),邊求邊輸出。單調(diào)隊(duì)列我是看百度百科加神犇們博客上的代碼看懂的,真的很好懂。
AC以后翻看了洛谷這題5頁(yè)的AC記錄,外加百度一下找到的解法,總結(jié)一下RMQ有以下幾種解法
1、暴力——不說(shuō)了
2、單調(diào)隊(duì)列——跑得又快,代碼又短,這題AC用時(shí)在1000ms~2000ms人丑常數(shù)大。記錄里普遍在1300ms到16000ms,在這范圍之外的很少,我的1428ms。
3、ST表(稀疏表,你要說(shuō)是DP也行)——類似于倍增,記錄一個(gè)個(gè)區(qū)間長(zhǎng)度為1、2、4、8…的區(qū)間最值然后@#¥%,代碼也挺簡(jiǎn)短我不會(huì),正常寫(xiě)法$O(nlogn)$預(yù)處理(聽(tīng)說(shuō)可以達(dá)到$O(n)$),然后$O(1)$查詢(聽(tīng)說(shuō)標(biāo)準(zhǔn)應(yīng)該是$O(\log_2(\log_2n)),和$O(1)$差不多,就成$O(1)$了)。
4、利用區(qū)間最值區(qū)間加性質(zhì)的一系列數(shù)據(jù)結(jié)構(gòu)
a、線段樹(shù)——作用大,RMQ裸題殺雞用牛刀了,記錄里普遍3000ms~7000ms(預(yù)處理真慢)。
b、樹(shù)狀數(shù)組——記錄里前幾頁(yè)沒(méi)翻到,用題解里的代碼測(cè)試了一下,居然才90分,一個(gè)點(diǎn)TLE了他的樹(shù)狀數(shù)組常數(shù)真大。就算這個(gè)點(diǎn)是1500ms吧,那總共耗時(shí)3526ms。
c、zkw線段樹(shù)——神奇的數(shù)據(jù)結(jié)構(gòu)我不會(huì),作用同樣巨大,題解里的代碼2410ms。
5、最高端的做法——建一棵笛卡爾樹(shù)#$%^#@,然后對(duì)每個(gè)詢問(wèn)在樹(shù)上求一波LCA^@%%@%……好復(fù)雜我不會(huì)。
源代碼
#include<stdio.h> #include<string.h> int a[1000010]={0},n,k; int q[1000010]={0},l=1,r=1;int main() {scanf("%d%d",&n,&k);l=1,r=1;memset(q,0,sizeof(q));for(int i=1;i<=n;i++) scanf("%d",a+i);for(int i=1;i<=n;i++){while(l<r&&a[q[r-1]]>a[i]) r--;q[r++]=i;while(l<r&&q[l]<=i-k) l++;if(i>=k) printf("%d ",a[q[l]]);}printf("\n");l=1,r=1;memset(q,0,sizeof(q));for(int i=1;i<=n;i++){while(l<r&&a[q[r-1]]<a[i]) r--;q[r++]=i;while(l<r&&q[l]<=i-k) l++;if(i>=k) printf("%d ",a[q[l]]);}printf("\n");return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/wawcac-blog/p/6986710.html
總結(jié)
以上是生活随笔為你收集整理的洛谷 P1886 滑动窗口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PHP的面向对象 — 封装、继承、多态
- 下一篇: 使用Preplot批量将ascii文件转