數字錄音中,聲音是用表示空氣壓力的數字序列描述的,序列中的每個值稱為乙個取樣,每個取樣之間間隔一定的時間。
很多聲音處理任務都需要將錄到的聲音分成由靜音隔開的幾段非靜音段。為了避免分成過多或者過少的非靜音段,靜音通常是這樣定義的: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複製
26
#include#define n 1001000using
namespace
std;
void read(int &x)
class
segmengtree
tree[n
<<2
];
#define ls index<<1
#define rs index<<1|1
#define l tree[index].l
#define r tree[index].r
#define s1 tree[index].s1
#define s2 tree[index].s2
#define a tree[index].a
#define ll tree[ls].l
#define lr tree[ls].r
#define ls1 tree[ls].s1
#define ls2 tree[ls].s2
#define la tree[ls].a
#define rl tree[rs].l
#define rr tree[rs].r
#define rs1 tree[rs].s1
#define rs2 tree[rs].s2
#define ra tree[rs].a
public
:
void update(int
index)
void buildtree(int l,int r,int
index)
int mid=(l+r)>>1
; buildtree(l,mid,ls);
buildtree(mid+1
,r,rs);
update(index);
}int querymax(int l,int r,int
index)
int querymin(int l,int r,int
index)
}t;int
n,m,c;
void
input()
void
solve()
}if (!flag)
}main()
Sound靜音問題 bzoj1342
問題 c sound靜音問題 bzoj1342 時間限制 1 sec 記憶體限制 128 mb 提交 116 解決 38 提交 狀態 題目描述 數字錄音中,聲音是用表示空氣壓力的數字序列描述的,序列中的每個值稱為乙個取樣,每個取樣之間間隔一定的 時間。很多聲音處理任務都需要將錄到的聲音分成由靜音隔開...
P4392 BOI2007 Sound 靜音問題
數字錄音中,聲音是用表示空氣壓力的數字序列描述的,序列中的每個值稱為乙個取樣,每個取樣之間間隔一定的時間。很多聲音處理任務都需要將錄到的聲音分成由靜音隔開的幾段非靜音段。為了避免分成過多或者過少的非靜音段,靜音通常是這樣定義的 m個取樣的序列,該序列中取樣的最大值和最小值之差不超過乙個特定的閾值c。...
P4392 BOI2007 Sound 靜音問題
本題其實可以拆解程兩個問題,求區間最大值 求區間最小值。而這兩個操作都必須在 o log n 內完成。自然想到線段樹。線段樹需要維護兩個資訊 區間最大值 區間最小值。輸入完資料後,建樹。然後遍歷序列,求區間最大值最小值之差,再判斷是否大於 c 就可以了。記得立乙個 flag 方便記錄是否有解。很重要...