[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 <algorithm>
#define N 1001000
#define inf 0x3f3f3f3f
using namespace std;
int id1[N],x1[N],l1,r1;
int id2[N],x2[N],l2,r2;
int n,m,p,s[N];
int main()
{
	scanf("%d%d%d",&n,&m,&p);
	for(int i=1;i<=n;i++)scanf("%d",&s[i]);
	l1=l2=1,r1=r2=0;
	int flag=1;
	for(int i=1;i<=n;i++)
	{
		while(l1<=r1&&i-id1[l1]>=m)l1++;
		while(l2<=r2&&i-id2[l2]>=m)l2++;
		while(l1<=r1&&s[i]>=x1[r1])r1--;
		while(l2<=r2&&s[i]<=x2[r2])r2--;
		id1[++r1]=id2[++r2]=i;
		x1[r1]=x2[r2]=s[i];
		if(i>=m)if(x1[l1]-x2[l2]<=p)
			printf("%d\n",i-m+1),flag=0;
	}
	if(flag)puts("NONE");
	return 0;
}

小结:单调队列内是两个关键字,一个关键字随下标递增而变优,另一关键字随下标递增而变劣。

原文地址:https://www.cnblogs.com/ShuraK/p/9393953.html

时间: 2024-10-25 15:13:31

[bzoj1342][Baltic2007]Sound静音问题_单调队列的相关文章

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

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 ***************

【尺取法】【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

shu_1078 vijos_1091(环城旅行)_单调队列

http://202.121.199.212/JudgeOnline/problem.php?cid=1078&pid=9 分析: a[ i ] :  第i个城市的汽油与到下一个城市距离的差: dis[ i ] : 第i个城市到下一个城市的距离: s[ i ] : 前i个 a[ i ] 的和: 路径 i-->i+n 中间不断油,那么 T= ai + (ai+1)+ ...( ak)  对于任意的 i < k <=i+n, T都要大于0, 即, T= s[ k ]- s[ i-1

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_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP

题意: N头牛,每头牛有一个权值,选择一些牛,要求连续的不能超过k个,求选择牛的权值和最大值 分析: 先考虑暴力DP,f[i] = f[j] + s[i]-s[j+1] (i-j-1<=k 1<=j<i) 意思是我们j+1不要,要j+2到i这部分 发现可以用单调队列优化一下 维护一个单调递减的单调队列,比较时用f[i]-s[i-1]比较 代码: #include <stdio.h> #include <string.h> #include <algorith

hdu 3401(单调队列优化dp)

注意:这题题意是有操作的天数相隔要大于w 然后列出状态转移方程就可以发现,可以用优点队列优化啦. 构造状态dp[i][j]表示第i 天拥有 j只股票的时候,赚了多少钱 状态转移有: 1.从前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.从前i-W-1天买进一些股: dp[i][j]=max(dp[i-W-1][k]-(j-k)*AP[i],dp[i][j]) 3.从i-W-1天卖掉一些股: dp[i][j]=max(dp[i-W-1][k]+(k-j)*

Sound静音问题

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