Sound靜音問題

1342: [Baltic2007]Sound靜音問題

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 1183  Solved: 542
[Submit][Status][Discuss]

Description

數字錄音中,聲音是用表示空氣壓力的數字序列描述的,序列中的每一個值稱爲一個採樣,每一個採樣之間間隔必定的
時間。 不少聲音處理任務都須要將錄到的聲音分紅由靜音隔開的幾段非靜音段。爲了不分紅過多或者過少的非
靜音段,靜音一般是這樣定義的:m個採樣的序列,該序列中採樣的最大值和最小值之差不超過一個特定的閾值c。
 請你寫一個程序,檢測n個採樣中的靜音。

Input

第一行有三個整數n,m,c,分別表示總的採樣數、靜音的長度和靜音中容許的最大噪音程度。
第2行n個整數ai,表示聲音的每一個採樣值,每兩個整數之間用空格隔開。
1<=n<=1000000,1<=m<=10000,0<=c<=10000
0<=ai<=1,000,000

Output

列出了全部靜音的起始位置i
i知足max(a[i, . . . , i+m−1]) − min(a[i, . . . , i+m−1]) <= c
每行表示一段靜音的起始位置,按照出現的前後順序輸出。
若是沒有靜音則輸出NONE。

Sample Input

7 2 0
0 1 1 2 3 2 2

Sample Output

2
6

HINT

 

Source

#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;
}
相關文章
相關標籤/搜索