BZOJ1342 [Baltic2007]Sound静音问题

越来越水了。。。

这道题是简单的单调队列,同时维护最大值和最小值即可。

另解:multiset大法求区间最大最小,但是复杂度会上升。。。

 1 /**************************************************************
 2     Problem: 1342
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:944 ms
 7     Memory:12524 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11
12 using namespace std;
13 const int N = 1000005;
14 int n, m, C, a[N];
15 int q1[N], q2[N], h1, h2, t1, t2;
16 bool f;
17
18 inline int read(){
19     int x = 0;
20     char ch = getchar();
21     while (ch < ‘0‘ || ch > ‘9‘)
22         ch = getchar();
23     while (ch >= ‘0‘ && ch <= ‘9‘){
24         x = x * 10 + ch - ‘0‘;
25         ch = getchar();
26     }
27     return x;
28 }
29
30 int pr[10], NUM = 0;
31 inline int print(int x){
32     while (x)
33         pr[++NUM] = (x % 10) + ‘0‘, x /= 10;
34     while (NUM)
35         putchar(pr[NUM--]);
36     putchar(‘\n‘);
37 }
38
39 inline bool check(int i){
40     return a[q1[h1]] - a[q2[h2]] <= C && i >= m;
41 }
42
43 int main(){
44     n = read(), m = read(), C = read();
45     int i;
46     for (i = 1; i <= n; ++i)
47         a[i] = read();
48     f = 0;
49     q1[1] = q2[1] = 1, h1 = t1 = h2 = t2 = 1;
50     for (i = 2; i <= n; ++i){
51         while (q1[h1] + m <= i) ++h1;
52         while (h1 <= t1 && a[q1[t1]] <= a[i]) --t1;
53         q1[++t1] = i;
54         while (q2[h2] + m <= i) ++h2;
55         while (h2 <= t2 && a[q2[t2]] >= a[i]) --t2;
56         q2[++t2] = i;
57         if (check(i)){
58             print(i - m + 1);
59             f = 1;
60         }
61     }
62     if (!f) puts("NONE");
63     return 0;
64 }

(p.s. 那个300ms的这是怎么做到的。。。我输入输出外挂都开了好不好。。。哭T T)

时间: 2024-10-23 19:08:28

BZOJ1342 [Baltic2007]Sound静音问题的相关文章

[bzoj1342][Baltic2007]Sound静音问题_单调队列

Sound静音问题 bzoj-1342 Baltic-2007 题目大意:给定一个n个数的序列,求所有的长度为m的区间,使得区间内最大值减去最小值不超过阈值c. 注释:$1\le n \le 10^6$,$1\le m\le 10^4$. 想法:单调队列裸题. 定长区间最值问题显然可以用单调队列维护. 最后,附上丑陋的代码... ... #include <iostream> #include <cstdio> #include <cstring> #include &

【尺取法】【Multiset】bzoj1342 [Baltic2007]Sound静音问题

O(n)地枚举所有长度为k的段,每次暴力转移. 转移的时候只是从最后插入一个数,从前面删去一个数. 计算的时候要取当前的max和min. 用multiset(∵元素是可重的)以上这些操作都是O(logn)的. 1 #include<cstdio> 2 #include<set> 3 using namespace std; 4 multiset<int>S; 5 multiset<int>::iterator it; 6 int n,m,limit; boo

1342: [Baltic2007]Sound静音问题

1342: [Baltic2007]Sound静音问题 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 710  Solved: 307[Submit][Status][Discuss] Description 静音问题 数字录音中,声音是用表示空气压力的数字序列描述的,序列中的每个值称为一个采样,每个采样之间间隔一定的时间. 很多声音处理任务都需要将录到的声音分成由静音隔开的几段非静音段.为了避免分成过多或者过少的非静音段,静音通常是这样定义的:m

BZOJ 1342 Baltic2007 Sound静音问题 单调队列

题目大意:给定一个长度为n的序列,求哪些长度为m的区间满足区间内最大值与最小值之差小于等于c 利用单调队列维护区间内的最大值和最小值- - 硬搞就可以了- - 刷刷水题真爽- - #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 1001001 using namespace std; int n,m,c,a[M]; int q_ma

BZOJ_1342_[Baltic2007]Sound静音问题_单调队列

题意: 给出n个数,求∑[ max{a[i]~a[i+m-1]} - min{a[i]~a[i+m-1]} <= c ] 分析: 滑动窗口 我们维护两个单调队列,分别存最大,最小值 代码: #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define N

Sound静音问题

1342: [Baltic2007]Sound静音问题 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1183  Solved: 542[Submit][Status][Discuss] Description 数字录音中,声音是用表示空气压力的数字序列描述的,序列中的每个值称为一个采样,每个采样之间间隔一定的 时间. 很多声音处理任务都需要将录到的声音分成由静音隔开的几段非静音段.为了避免分成过多或者过少的非 静音段,静音通常是这样定义的:m个采

Luogu P4392 [BOI2007]Sound 静音问题

Luogu P4392 [BOI2007]Sound 静音问题 解析 挺简单的一道线段树题目,区间长度已经给定,只需用线段树处理区间最大.最小值,然后枚举区间左端点,判断这段区间是否合法即可 Code #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define LL long long using namespa

【BZOJ1342】【Baltic2007】Sound静音问题 单调队列

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/42971677"); } 题意: 虽然这道题是汉语的,但是我有必要说一下题意. 就是问你长度为m的区间中,有哪些区间的最大值-最小值<=c,输出这个区间的左端点. 注意!!!如果没有方案输出NONE. 题解: 首先我们可以写一个multiset2

【单调队列】BZOJ1342-[Baltic2007]Sound静音问题

[题目大意] 给出一个n个数的序列,以哪位位置为开头的长度为m的区间满足该区间的最大值与最小值的差≤一个定值. [思路] 单调队列--说一下单调队列比较方便的操作. 把第一个先丢进去,开始条件为head=tail=1.就OK了.我以前总是喜欢左闭右开,还是都闭合好了不容易写错QAQ 所以--越刷越水,去睡觉! 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAXN=1000000+50; 4 int maxque[MA