數字錄音中,聲音是用表示空氣壓力的數字序列描述的,序列中的每個值稱為乙個取樣,每個取樣之間間隔一定的時間。
很多聲音處理任務都需要將錄到的聲音分成由靜音隔開的幾段非靜音段。為了避免分成過多或者過少的非靜音段,靜音通常是這樣定義的:m個取樣的序列,該序列中取樣的最大值和最小值之差不超過乙個特定的閾值c。
請你寫乙個程式,檢測n個取樣中的靜音。
第一行有三個整數n,m,c( 1<= n<=1000000,1<=m<=10000, 0<=c<=10000),分別表示總的取樣數、靜音的長度和靜音中允許的最大噪音程度。
第2行n個整數ai (0 <= ai <= 1,000,000),表示聲音的每個取樣值,每兩個整數之間用空格隔開。
列出了所有靜音的起始位置i(i滿足max(a[i, . . . , i+m−1]) − min(a[i, . . . , i+m−1]) <= c),每行表示一段靜音的起始位置,按照出現的先後順序輸出。如果沒有靜音則輸出none。
輸入 #1
7 2 00 1 1 2 3 2 2
輸出 #1
2根據題目來:1.先6
維護區間的最大以及最小,然後向裡面新增數(一次乙個)2.求和 3.完結撒花✿✿ヽ(°▽°)ノ✿
**
#include#include#include#include#includeusing namespace std;const int n=1000010;
int n,m,ci,cnt;
int ans[n],a[n];
struct no c[2*n];
int lowbit(int x)
void add(int p,int x)
}bool sum(int l,int r)
mx=max(a[r],mx);
mn=min(a[r],mn);
r--;
} if(abs(mx-mn)<=ci)
return true;
return false;
}int main ()
for(int i=1; i<=n-m+1; i++)
if(sum(i,i+m-1))
ans[++cnt]=i;
for(int i=1; i<=cnt; i++)
printf("%d\n",ans[i]);
if(cnt==0)
printf("none\n");
return 0;
}
P4392 BOI2007 Sound 靜音問題
本題其實可以拆解程兩個問題,求區間最大值 求區間最小值。而這兩個操作都必須在 o log n 內完成。自然想到線段樹。線段樹需要維護兩個資訊 區間最大值 區間最小值。輸入完資料後,建樹。然後遍歷序列,求區間最大值最小值之差,再判斷是否大於 c 就可以了。記得立乙個 flag 方便記錄是否有解。很重要...
BOI2007 Sequence 序列問題
對於乙個給定的序列a1,an,我們對它進行乙個操作reduce i 該操作將數列中的元素ai和ai 1用乙個元素max ai,ai 1 替代,這樣得到乙個比原來序列短的新序列。這一操作的代價是max ai,ai 1 進行n 1次該操作後,可以得到乙個長度為1的序列。我們的任務是計算代價最小的redu...
BOI2007 名次排序問題 sorting
已知參賽選手的得分,你的任務是按照得分從高到底給出選手的排名。遺憾的是,儲存選手資訊的資料結構只支援一種操作,即將乙個選手從位置i移動到位置j,該移動不改變其他選手的相對位置,即如果i j,位置j和位置i 1之間的選手的位置都比原來加1,相反如果 i j,則位置i 1和位置j之間的選手的位置都比原來...