數字錄音中,聲音是用表示空氣壓力的數字序列描述的,序列中的每一個值稱爲一個採樣,每一個採樣之間間隔必定的
時間。 不少聲音處理任務都須要將錄到的聲音分紅由靜音隔開的幾段非靜音段。爲了不分紅過多或者過少的非
靜音段,靜音一般是這樣定義的:m個採樣的序列,該序列中採樣的最大值和最小值之差不超過一個特定的閾值c。
請你寫一個程序,檢測n個採樣中的靜音。
#include <bits/stdc++.h> #define rg register int using namespace std; typedef long long ll; const ll mod = 1e9 + 7; const int maxn = 2e6 + 10; int n, m, c; int o[maxn]; int q1[maxn], q2[maxn], x_head, x_tail, n_head, n_tail; int res; int main() { #ifndef ONLINE_JUDGE freopen("splay.txt", "r", stdin); #endif scanf("%d%d%d", &n, &m, &c); x_head = 1, x_tail = 0; bool check = false; for (register int i = 1; i <= n; ++i) { scanf("%d", &o[i]); while (x_head <= x_tail && i - q1[x_head] + 1 > m)++x_head; while (n_head <= n_tail && i - q2[n_head] + 1 > m)++n_head; while (n_head <= n_tail && o[q2[n_tail]] >= o[i])--n_tail; q2[++n_tail] = i; while (x_head <= x_tail && o[q1[x_tail]] <= o[i])--x_tail; q1[++x_tail] = i; if (i - m + 1 >= 1 && o[q1[x_head]] - o[q2[n_head]] <= c) { ++res; printf("%d\n", i - m + 1); check = true; } } if (!check)puts("NONE"); return 0; }