【BZOJ1342】Sound靜音問題

1342: [Baltic2007]Sound靜音問題

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 858  Solved: 383
[Submit][Status][Discuss]

Description

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

Input

第一行有三個整數n,m,c( 1<= n<=1000000,1<=m<=10000, 0<=c<=10000),分別表示總的採樣數、靜音的長度和靜音中容許的最大噪音程度。第2行n個整數ai (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

sol:php

單調隊列 複雜度$O(n)$ios

板子題ide

/*In Search Of Life*/
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<iomanip>
#include<stack>
#include<map>
#include<set>
#include<cmath>
#define debug(x) cerr<<#x<<"="<<x<<endl
#define INF 0x7f7f7f7f
#define llINF 0x7fffffffffffll
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
inline int init()
{
    int now=0,ju=1;char c;bool flag=false;
    while(1)
    {
        c=getchar();
        if(c=='-')ju=-1;
        else if(c>='0'&&c<='9')
        {
            now=now*10+c-'0';
            flag=true;
        }
        else if(flag)return now*ju;
    }
}
inline long long llinit()
{
    long long now=0,ju=1;char c;bool flag=false;
    while(1)
    {
        c=getchar();
        if(c=='-')ju=-1;
        else if(c>='0'&&c<='9')
        {
            now=now*10+c-'0';
            flag=true;
        }
        else if(flag)return now*ju;
    }
}
int qa[1000005],qb[1000005],a[1000005];
int head=1,tail=0;
int maxx[1000005],minx[1000005];
int main()
{
    freopen("sound.in","r",stdin);
    freopen("sound.out","w",stdout);
    bool f=false;
    int n,m,c;
    n=init();m=init();c=init();
    for(int i=1;i<=n;i++)a[i]=init();
    for(int i=1;i<=n;i++)
    {
        while(tail>=head&&a[qa[tail]]>a[i])
        {
            --tail;
        }
        qa[++tail]=i;
        while(head<=tail&&qa[tail]-qa[head]>=m)
        {
            ++head;
        }
        minx[i]=a[qa[head]];
    }
    head=1,tail=0;
    for(int i=1;i<=n;i++)
    {
        while(tail>=head&&a[qb[tail]]<a[i])
        {
            --tail;
        }
        qb[++tail]=i;
        while(head<=tail&&qb[tail]-qb[head]>=m)
        {
            ++head;
        }
        maxx[i]=a[qb[head]];
        if(maxx[i]-minx[i]<=c&&i>=m)
        {
            printf("%d\n",i-m+1);
            f=1;
        }
    }
    if(!f)puts("NONE");
    return 0;
}
View Code
相關文章
相關標籤/搜索