单调队列—— HDU 4193 Non-negative Partial Sums

高分7(GF7)卫星数据制作平原地区DSM/DEM(三)——可信度分割 李国春(接上) 阅读详情

Non-negative Partial Sums

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1357    Accepted Submission(s): 518


Problem Description
You are given a sequence of n numbers a0,..., an-1. A cyclic shift by k positions (0<=k<=n-1) results in the following sequence: ak ak+1,..., an-1, a0, a1,..., ak-1. How many of the n cyclic shifts satisfy the condition that the sum of the fi rst i numbers is greater than or equal to zero for all i with 1<=i<=n?
 

Input
Each test case consists of two lines. The fi rst contains the number n (1<=n<=106), the number of integers in the sequence. The second contains n integers a0,..., an-1 (-1000<=ai<=1000) representing the sequence of numbers. The input will finish with a line containing 0.
 

Output
For each test case, print one line with the number of cyclic shifts of the given sequence which satisfy the condition stated above.
 

Sample Input
3 2 2 1 3 -1 1 1 1 -1 0
 

Sample Output
3 2 0

思路:

 

以一个长度n为5的数串(-10,3,-1,5,4)为例,如下图:

 

为了简化操作,A[]和Sum[]的存储都从1开始,0下标位置的值都赋为0。 

 

A[]存储数字串以及它的一份拷贝,图中绿色方框为原数据(下标为1~n),黄色方框为拷贝(下标为n~2*n)。那么这个数串的一个序列就是图中红色方框圈起来的n个数,这里称红色方框为滑动窗口。

 

Sum[]存储一段数字的和,Sum[i]表示,A[1]~A[i]的和。如上图中Sum[3] = -10 + 3 + -1 = -8。

 

这里设S(i)为:假设滑动窗口的最后一个数的下标为就j,那么j-n+1 <= i <= j,S(i) = A[j-n+1] + A[j-n] + … + A[i]。题中要找满足滑动窗口内所有S(i) >= 0条件的序列,所以只需要找出最小的S(i),如果它的值都大于等于0的话,该序列就满足条件。使用单调递增队列来寻找最小的S(i)。

 

Sum[i]和S(i)的转化关系为:当前滑动窗口的末尾数的下标为j,S (i) =Sum[i] – Sum[j-n]。

代码:

#include <stdio.h>

#define MAXN 1000000

int sum[2*MAXN+5];	//将长度为n的数串复制为两份存储在sum中,下标从1开始
					//然后,sum[i]存储数串的前i项和
int n;				//数串的长度

int mq[MAXN+5];		//单调递增队列,队列元素为sum数组的下标
int front;			//队首指针
int rear;			//队尾指针,指向队尾的下一个位置

void InitMQ(void)
{
	front = rear = 0;
}

bool IsEmpty(void)
{
	return front == rear;
}

void Push(int i)
{
	while (!IsEmpty() && sum[mq[rear-1]] > sum[i])
	{
		rear--;
	}
	mq[rear++] = i;
}

int Front(void)
{
	return mq[front];
}

void Pop(void)
{
	front++;
}

int main(void)
{
	sum[0] = 0;
	while (scanf("%d", &n) != EOF)
	{
		if (n == 0)
		{
			break;
		}

		int i;
		for (i = 1; i <= n; i++)	//输入数据,并复制为两份
		{
			scanf("%d", &sum[i]);
			sum[i+n] = sum[i];
		}

		for (i = 2; i < n*2; i++)		//计算前i项和
		{
			sum[i] += sum[i-1];
		}

		InitMQ();
		for (i = 1; i < n; i++)
		{
			Push(i);
		}

		int count = 0;
		for (i = n; i < n*2; i++)
		{
			if (Front() + n - 1 < i)	//弹出不在滑动窗口内的数据
			{
				Pop();
			}
			Push(i);
			if (sum[Front()] - sum[i-n] >= 0)	//序列是否满足条件
			{
				count++;
			}
		}

		printf("%d\n", count);
	}
	return 0;
}

/*
5
-3 2 -1 5 3
*/

SAP HANA 中的 Union Node Pruning:让 Calculation View 少走弯路的关键优化 摘要:SAP HANA的Union Node Pruning技术通过在执行前排除无关数据源来优化查询性能。该技术主要采用三种方式:Constant Mapping(适用于规则稳定的场景)、Pruning Configuration Table(灵活性高)和Column-Based Pruning(基于列可用性)。典型应用场景包括分层存储的数据查询,如区分当前和历史销售数据。需要注意的是,当查询发生Unfolding且不含聚合时,Pruning可能失效,此时可通过NO_CALC_VIEW_UNFOLDING提 阅读详情

相关推荐

爬取信用中国里面的行政处罚

result字段名为行政处罚文书号、处罚决定日期、处罚内容、处罚金额、违法事实、处罚机关、公司名称,行政处罚次数。file_path=r'E:\Data analyze\python\行政处罚爬虫/'#路径需要按实际修改。writer = pd.ExcelWriter('统计.xlsx')# 写入Excel文件。src_workbook=file_path+r'行政处罚(名单).xls' #表格名称也要更改。# keyword = input("输入爬取的公司全称必须是全称")

qq_42863025的博客 1674

HDU 4193 Non-negative Partial Sums(单调队列)

题目链接:Click here~~ 上次比赛的一道题,可以用单调队列做。 题意: 给你一个n项的序列,每次可以把序列的首项移动到末尾,显然一共可以构成 n 种序列,问一共有多少种序列满足条件:序列的前 i 项和都大于等于0(i:1~n)。 解题思路: 开一个 2*n 的数组,后面 n 项复制前面 n 项。这样,每个长度为 n 的区间都代表一种序列(这也是循环序列的一般做法吧)。 然...

爱.NET 204

基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(三)SD卡驱动、FatFS等的移植和ini配置文件读取的实现

本文实现了基于STM32F107VC的金牛开发板的基于SPI模式的SD卡驱动和FatFS的移植,以及利用minini库对ini配置信息文件进行读取。

sqshining的专栏 2137

hdu 4193 Non-negative Partial Sums (单调队列)

Non-negative Partial Sums Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1357    Accepted Submission(s): 518 Problem Description You are giv...

pxlsdz的博客 452

74HC138译码器的原理和使用

A0,A1,A2为3位二进制加权地址输入端口,A2A1A0顺序组成的3位2进制数对应的十进制数x控制使能端口Yx';例如当A2A1A0 = 101 时,其他门输出端全为高电平,只有Y5'为低电平。 Y0-Y7为8个输出端口,其输出电平由A0,A2,A3,E1,E2,E3决定。

diksan的博客 6万+

【创作赢红包】Gurobi学术版证书更新与Python环境配置全攻略

本文详细解析了Gurobi学术版证书过期后的完整更新流程与Python环境配置方法。从彻底清理旧版残留、手把手注册获取新许可证,到软件安装、证书激活,最后重点讲解如何将gurobipy接口正确配置到Python的site-packages目录,并提供了常见问题排查方案,帮助用户高效解决证书与配置难题。

efc1234567的博客 612

HDU 4193 Non-negative Partial Sums

也是单调队列维护前缀和的问题。

\*zyeric*/ 478

Altium AD20差分对走线设置方法

AD20的PCB差分对走线设置 1、原理图添加差分对 先在原理图中,讲要设置差分对的网络对添加网络标签。 名称前面的内容要相同,后缀用 _P 和 _N 加以区分。 最后使用 放置差分对,将两个网络标记。 2、编译,更改到PCB 编译,更新到PCB,确认差分对网络的出现。 验证更改,执行更改。将改动更新到PCB中。 PCB中,可通过 右下角 Panels - 调出 PCB 显示。来对已添加的差分对进行查看。 这时原本的走线有一点点小问题,需要删掉原来走线,设置差分对规则,并重新布线。

Mark_md的博客 3万+

HDU - 4193 Non-negative Partial Sums(单调队列)

点我看题 题意:给一个序列a0,a1,a2......an-1,这个序列阔以循环移动,如a0,a1,a2......an-1变为a1,a2......an-1,a0,a1,a2......an-1,a0变为a2......an-1,a0,a1等等,问这样不断的移动,一共有多少个序列满足前i(1 分析:这跟之前的hdu3415(题解)求最大最小值类似,本题直接求最小值看是否大于等于0,是的话这个

Vmorish 372

android 9.0Settings休眠时间项(屏幕超时)添加永不休眠功能

在9.0的系统产品开发中,系统中默认息屏时间为1分钟,可以通过在Setting中的息屏时间选项设置对应的息屏时间,但是在开发平板类的产品中,需要实现永不休眠的功能,所以需要在Settings中的息屏时间中添加永不休眠时间这一项来实现这个功能,接下来看息屏时间的相关功能,来添加这个功能

安卓兼职framework和app工程师的博客 2055

基于深度学习的灰度图像气泡群识别与优化

灰度图像气泡群深度学习识别优化研究 本研究针对MATLAB实现的深度学习气泡群识别系统在从1445个点到4992个点扩展时出现的精度不稳定问题,提出了一套完整的解决方案。文章首先分析了问题根源,包括数据复杂度增加、类别不平衡、网络容量不足等因素,然后系统性地提出了数据预处理增强、网络架构优化、训练策略调整和后处理算法改进等优化措施。通过改进的U-Net架构、自适应直方图均衡化等技术创新,有效提升了模型在大规模气泡群图像上的识别精度和稳定性,为化工、生物医学等领域的灰度图像分析提供了可靠的技术支持。

max500600的博客 411

HDU 4193 Non-negative Partial Sums(前缀和非负点个数,单调队列)

题目链接: HDU 4193 Non-negative Partial Sums 题意: 给一个nn个数的数环,求任意前缀和非负的点个数? 数据范围:n≤106n\leq 10^6 分析: 其实这道题和UVALive 6087 Fuel Stops是一样的。之前的做法也能做。 如果用单调队列做的话,需要转化成前缀和问题。对于位置ii的数,如果以它为结尾最长长度为nn的前缀和均非负,其实

ramay7 850

回归预测 | MATLAB实现SVR(支持向量机回归)K折交叉验证

回归预测 | MATLAB实现SVR(支持向量机回归)K折交叉验证 目录回归预测 | MATLAB实现SVR(支持向量机回归)K折交叉验证基本介绍划分原理留一划分交叉验证K折交叉数据下载程序设计参考资料致谢 基本介绍 在机器学习里,通常来说我们不能将全部用于数据训练模型,否则我们将没有数据集对该模型进行验证,从而评估我们的模型的预测效果。为了解决这一问题,有如下常用的方法: 第一种是最简单的,也是很容易就想到的。我们可以把整个数据集分成两部分,一部分用于训练,一部分用于验证,这也就是我们经常提到的训练集

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 6375

HDU 4193 Non-negative Partial Sums【单调队列】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4193 题意: 给定序列,可以把后面的连续的部分移到最前面来,问多少种移法使得最终得到的序列的前i项和均大于等于0(1≤i≤n)? 分析: 先将数组前后拼接起来,记录每个位置的前缀和。然后去找长度为n的滑动窗口,在这个窗口内,要保证前i项和大于等于0,也即区...

An55511的博客 310

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

HDU 4193 Non-negative Partial Sums(想法题,单调队列)

HDU 4193 题意:给n个数字组成的序列(n 思路: 这题看到数据规模觉得只能用最多O(nlogn)的算法,然后想到了之前刚做过的有关最小表示法的题,但还没证明出一个做这题有效的算法出来。 后来看过题解,发现用的最多的方法是单调队列,然而我对这个知识点知之甚少orz /*科普君:from单调队列 单调队列是指:队列中元素之间的关系具有单调性,而且,队首和队尾都可以进行出队操作,只

a novice 910

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

HDU 4193 Non-negative Partial Sums 【单调队列】

题目链接 题意 给一串长度为n的数列,问数列中存在多少个元素,使得以这个元素为首的长度为(1,2,…,n)的连续子序列都大于0(如果子序列超出了原数列,则又从第一个元素开始)? 分析 首先这种涉及循环同构的题,通常还是把整个数组复制一遍接到原数组后面这样处理。考虑数据量,n在1e6,估计O()n2)级别的就会炸掉。考虑题目中需要大量求区间和,仍然用转化区间...

babao9492的博客 167

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

HDU OJ 4193 Non-negative Partial Sums 【单调队列】

原题连接:http://acm.hdu.edu.cn/showproblem.php?pid=4193 单调队列详解:参考    http://blog.youkuaiyun.com/dgq8211/article/details/7430726   ,讲的很好。 AC代码: #include #include const int M=1000002<<1; int sum[M],q[M]; int h

nyist_飘谊 2167

hdu 4193 Non-negative Partial Sums 单调队列

先复制一遍数组,在用一个数组sum[ i ]表示前 i 个数字的和,对于以第k个数开头的情况,只需找出sum[ k ]到sum[ k+n ]的最小值min,如果min - sum[ k-1 ]大于0则满足。 #include <stdio.h> #define maxn 2001000 int a[maxn],sum[maxn]; int q[2*maxn]; in...

amily05200的博客 131

HDU-4193 Non-negative Partial Sums 单调队列

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4193         题意:给定一个数列,进行绕环移动,然后问所有前缀和都大于等于零的数列有多少。         首先按照一般方法,把数列往后复制,即a1a2,,,ana1a2,,,an,然后对其求前缀和。接下来就要求移动的区间内的最小值(这里很像POJ2823),看其是否大于等于零。那么就可用到单

岁月流风、、 1001

单调队列-hdu-4193-Non-negative Partial Sums

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4193 题目大意: 给n个数,a0,a1,...an,求ai,ai+1,...an,a1,a2,...ai-1这样的排列种数,使得所有的前k(1 解题思路: 求前缀和,加倍序列。 要满足前k个和都>=0,只需最小值>=0,所以用单调队列维护一个最小的前缀和sum[i],(i>=j-n+

cc_again的专栏 1212

【单调队列】hdu 4193 Non-negative Partial Sums

http://acm.hdu.edu.cn/showproblem.php?pid=4193 题意:每次把最后一个元素移动到队首,求这n个数的所有前缀数组的和都>=0 分析:这货就是一个循环数组,用单调队列找出n个前缀的最小的和,只要判断这个最小的和是否>=0即可 #include #include using namespace std; const int NM=20000

yduqytd的专栏 817
上一篇: 单调队列——广告印刷
下一篇: 单调队列——HDU 3415 Max Sum of Max-K-sub-sequence
庞老板
博客等级 码龄15年 127粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

庞老板

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值