首页 > 其他分享 >Blocks(单调栈)

Blocks(单调栈)

时间:2024-02-22 09:04:10浏览次数:29  
标签:Blocks 平均值 int long empty 序列 单调

题干中说每次选择一个大于k的数,还要选他左右两个数其中之一加上一,最后问你最长的每个数不小于K的子序列。

这些都是障眼法,其实就是问你最长的平均值大于或等于K的最长子序列,这样就明朗了。

接下来就是找子序列的问题,因为要求的是区间最大平均值,所以不能再以单个数的值为依据来决定进出栈情况。

那只好用前缀和了,只不过要给每个数都减去K,这样还要把部分小于0的数入栈,遍历时倒序遍历,就可以求出各段的平均值了。

一旦找到满足条件的,就可以把answer更新一下,最后输出即可(记得置零)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
#define int long long
int s[N],k,i,n,m,a[N],ma,j,ans,ansl;
stack<int>q;
void clean(){
	memset(s,0,sizeof(s));
	while(!q.empty())q.pop();
	q.push(0);
	ans=0;
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(i=1;i<=n;i++)scanf("%lld",&a[i]),ma=max(ma,a[i]);
	for(i=1;i<=m;i++){
		scanf("%lld",&k);
		clean();
		if(k>ma){
			printf("0 ");
			continue;
		}
		for(j=1;j<=n;j++)s[j]=s[j-1]+a[j]-k;
		for(j=1;j<=n;j++)
			if(s[q.top()]>s[j])q.push(j);
		for(j=n;j>=0;j--){
			while(!q.empty()&&s[q.top()]<=s[j]){
				ansl=q.top();
				q.pop();
			}
			if(s[ansl]<=s[j])ans=max(ans,abs(j-ansl));
		}
		printf("%d ",ans);
		
	}	
	return 0;
}

记得开long long!!!)

标签:Blocks,平均值,int,long,empty,序列,单调
From: https://www.cnblogs.com/0shadow0/p/18026563

相关文章

  • [BZOJ1047][HAOI2007][AcWing1091]理想的正方形(单调队列)
    此题的数据相当大,暴力的显然过不了,即使是O(abn)的算法也会超时,所以只能考虑O(ablogn)或O(ab)的算法。50分暴力#include<bits/stdc++.h>usingnamespacestd;intn,a,b,m[1001][1001];intdx(intx,inty){ intmaxn=0,minn=0x7fffffff; for(inti=x;i<=x+n-1;++i){ for(in......
  • 单调队列、单调栈
    单调栈什么是单调栈单调栈是指一个栈内部的元素具有严格单调性的一种数据结构,分为单调递增栈和单调递减栈。单调栈的性质1.满足栈底到栈顶的元素具有严格单调性。2.满足栈的先进后出特性,越靠近栈顶的元素越先出栈元素进栈过程对于一个单调递减栈来说,若当前进栈的元素为a,如果a......
  • blocks——题解
    题目描述解析对于这道题,他要求大于k的数进行操作,所以直接让每个数减k,然后用前缀和维护一下与0比较就可以了,因为一段区间和的平均值大于k的话,那么这就是一个合法区间,即为操作后的这个区间和大于0,我们可以用一个单调递减栈去维护,先把比0小的推入栈中,因为要求最大区间,所以边界......
  • 学习笔记#5:单调队列优化&斜率优化
    学习笔记#5:单调队列优化&斜率优化单调队列首先要搞懂什么是单调队列。单调队列是一种求区间最值问题的一种方式,与其他RSQ问题的求解方法不同的是,它更善于解决滑动窗口式的RSQ问题,一般来说,假设我们要维护最大值,则需维护一个单调递减的队列,这样队首最大,每次取队首即可。而当......
  • 单调性优化
    【单调栈】柱状图最大矩形:首先我们有一个最简单的方法:\(O(n^3)\)枚举左右端点,然后再求中间的最小值,最后乘起来得到这段矩形组成的最大面积。求最小值,我们考虑到ST表,我们可以用它优化到\(O(n^2)\)。接下来我们考虑转换枚举思路:我们发现,一个矩形的大小,由它的左右端点,和它中间......
  • P1886-单调队列【黄】
    一道普普通通的模版题,让我想起了此前做过的绿题P1725,于是运用相同的知识轻松切掉本题Code#include<iostream>#include<cstring>#include<string>#include<cstdio>#include<cstdlib>#include<algorithm>#include<stack>#include<queue>#include......
  • 单调队列
    单调队列239.滑动窗口最大值int*maxSlidingWindow(int*nums,intnumsSize,intk,int*returnSize){*returnSize=numsSize-k+1;int*res=(int*)malloc(sizeof(int)*(*returnSize));//双端队列,从大到小排,记录在nums中的下标intdequeue[1......
  • 单调队列优化DP&斜率优化&四边形不等式
    在本文中,我们将通过一道题来浅谈DP优化三大妈。P3195[HNOI2008]玩具装箱-洛谷|计算机科学教育新生态(luogu.com.cn)对于这种类型的题目,我们一般可以转化为如下形式:那么,$val(i,j)$又通常分为两种情况:其值仅与$i,j$中的一个有关。其值与$i,j$两者都有关。单调队列......
  • 单调队列优化DP
    单调队列在DP中的基本应用,是对这样一类DP状态转移方程进行优化:\(dp[i]=\min\{dp[j]+a[i]+b[j]\},L(i)\lej\leR(i)\)。方程中的\(\min\)也可以是\(\max\),方程的特点是其中关于\(i\)的项\(a[i]\)和关于\(j\)的项\(b[j]\)是独立的,而\(j\)被限制在窗口......
  • 单调队列及单调队列优化DP
    首先是单调队列: 其实单调队列就是一种队列内的元素有单调性(单调递增或者单调递减)的队列,答案(也就是最优解)就存在队首,而队尾则是最后进队的元素。因为其单调性所以经常会被用来维护区间最值或者降低$DP$的维数已达到降维来减少空间及时间的目的。类似于滑动窗口等,单调队列具有......