問題 c: sound靜音問題(bzoj1342)
時間限制: 1 sec 記憶體限制: 128 mb
提交: 116 解決: 38
[提交][狀態]
題目描述
數字錄音中,聲音是用表示空氣壓力的數字序列描述的,序列中的每個值稱為乙個取樣,每個取樣之間間隔一定的 時間。 很多聲音處理任務都需要將錄到的聲音分成由靜音隔開的幾段非靜音段。為了避免分成過多或者過少的非 靜音段,靜音通常是這樣定義的:m個取樣的序列,該序列中取樣的最大值和最小值之差不超過乙個特定的閾值c。 請你寫乙個程式,檢測n個取樣中的靜音。
輸入第一行有三個整數n,m,c,分別表示總的取樣數、靜音的長度和靜音中允許的最大噪音程度。 第2行n個整數ai,表示聲音的每個取樣值,每兩個整數之間用空格隔開。 1<=n<=1000000,1<=m<=10000,0<=c<=10000 0<=ai<=1,000,000
輸出列出了所有靜音的起始位置i i滿足max(a[i, . . . , i+m−1]) − min(a[i, . . . , i+m−1]) <= c 每行表示一段靜音的起始位置,按照出現的先後順序輸出。 如果沒有靜音則輸出none。
樣例輸入
7 2 0
0 1 1 2 3 2 2
樣例輸出26
林肯是大頭:
bzoj
單調佇列模板題。。。竟然還卡住了
思路:維護一段長為m的區間,使區間中最大值最小值之差不大於c。。。
思路完事,實現出現一些問題。。。
單調佇列實際上應該就是維護一段移動連續的區間最大最小值,所以區間的長度其實就是限制隊尾的條件,與入隊一樣放在相同位置維護。
而題目的一些條件就是放在這些操作之後了吧。
注意:1.單調佇列易錯點:忽略隊首隊尾關係,一定要限制!
2.加入第乙個數時可以不用虛擬節點,而是進行tail=1,head=0的賦值,利用隊首隊尾關係讓出隊判斷略過
#include#includeusing namespace std;
const int maxn=1000000+10;
int a[maxn];
int qmax[maxn];
int h1=1,t1=0;
int qmin[maxn];
int h2=1,t2=0;
int pos=1;
int main()
if(!b) printf("none");
return 0;
}
Sound 靜音問題
數字錄音中,聲音是用表示空氣壓力的數字序列描述的,序列中的每個值稱為乙個取樣,每個取樣之間間隔一定的時間。很多聲音處理任務都需要將錄到的聲音分成由靜音隔開的幾段非靜音段。為了避免分成過多或者過少的非靜音段,靜音通常是這樣定義的 m個取樣的序列,該序列中取樣的最大值和最小值之差不超過乙個特定的閾值c。...
P4392 BOI2007 Sound 靜音問題
數字錄音中,聲音是用表示空氣壓力的數字序列描述的,序列中的每個值稱為乙個取樣,每個取樣之間間隔一定的時間。很多聲音處理任務都需要將錄到的聲音分成由靜音隔開的幾段非靜音段。為了避免分成過多或者過少的非靜音段,靜音通常是這樣定義的 m個取樣的序列,該序列中取樣的最大值和最小值之差不超過乙個特定的閾值c。...
P4392 BOI2007 Sound 靜音問題
本題其實可以拆解程兩個問題,求區間最大值 求區間最小值。而這兩個操作都必須在 o log n 內完成。自然想到線段樹。線段樹需要維護兩個資訊 區間最大值 區間最小值。輸入完資料後,建樹。然後遍歷序列,求區間最大值最小值之差,再判斷是否大於 c 就可以了。記得立乙個 flag 方便記錄是否有解。很重要...