Codeforces Round 915 (Div. 2) D题 单调栈,特殊情况入手

Problem - D - Codeforces

目录

题意:

思路:

把0放后面:

————

然后看懂下面思路,理解单调栈:

细节:

核心代码:


 

题意:

mex指的是该数组缺的最小的自然数,例如:数组0 1 2 缺3 ,0 1 3 缺2, 1 2 3 4 5缺0。

对set数组0 1 2来说,有0 , 0 1 ,0 1 2 ,而0缺1,   0 1缺2,   0 1 2缺3 ,所以cost加起来就是1+2+3=6。

然后给的数组大小为n,里面的数分别是0 ~ n - 1 

这个数组可以进行若干次循环移位,即第一位移到最后一位。

问最大cost

思路:

把0放后面:

“特殊情况入手”,指的是0在最后一位时

当0在最后一位时,前面所有数的cost都是0,因为它们缺0 。而0之前缺的是n,所以cost是n。

参考方式:(arr就是题目给的数组,我用的vector)

int zerop;
for (int i = 0; i < n; i++)
{
	if (arr[i] == 0)
	{
		zerop = i;
		break;
	}
}
vector<int>tmp(arr.begin() + zerop+1, arr.end());
for (int j = 0; j <= zerop; j++)
{
	tmp.push_back(arr[j]);
}

————

然后看懂下面思路,理解单调栈:

1.对于1 4 5 2 3 0,同我们刚开始的讲解,0前面cost全是0,而0自己是n即这里的6。这个时候我们进行操作入栈0。

至此,这种情况的cost就算完了。然后循环移位。

接下俩情况分两类:

①.(情况2 3 4 6

如果移位后最后一位的是一个比栈内数都,那么前面的比他小的数都有的,此时他的cost就是n(末尾是整个数组,n-1前所有的数都有)。而0前失去了这个数,那么0的cost就是这个数(代指a)。

那下一次移位最后一位b还是最大呢,同理,0前缺的最大的自然数还是上一个数a,而上一个数a也只缺这个新数b,cost即为b。b则取代最后的位置,cost为n。

②.(情况5

你一旦把的数c放后面,0后的c前面的那些比它大的数都“失了效”,它们之前缺的最大的自然数变成了这个数c,所以从栈内删掉这些数,把他们的cost改为c即可。

接下来遇到的情况也只会是这两种。每次算出cost,记录最大的即可。

细节:

为了方便算cost,一般就把数都放栈时,顺便求和了。

相同的数放单调栈后面会超时,所以可以另起一个栈记录数目(一起入栈一起出栈即可),这样相同的数入栈出栈非常快。

(所以单调栈就是栈里面的数是单调的嘛,这道题有点脑筋急转弯了,苛刻的条件,只能多刷题啦)

核心代码:

void solve()
{
	int n;
	cin >> n;
	vector<int>arr(n);
	for (int i = 0; i < n; i++)
	{
		cin >> arr[i];
	}
	ll ans = 0;
	int zerop;
	for (int i = 0; i < n; i++)
	{
		if (arr[i] == 0)
		{
			zerop = i;
			break;
		}
	}
	vector<int>tmp(arr.begin() + zerop+1, arr.end());
	for (int j = 0; j <= zerop; j++)
	{
		tmp.push_back(arr[j]);
	}
	//tmp结尾为0的cyclic
	stack<ll>monotone,numst;
	monotone.push(0); numst.push(1);
	ll sum = 0;
	sum += tmp.size();//总数组的
	ans = max(sum, ans);
	//你一旦把小的数放后面,前面那些大的数都失了效
	
	//如果你放的是一个“最大的数”,那么前面的小的数都有的,你替代0的位置,但对0来说,失去了你
	//那再放一个大的数呢,0已失去小的,而那个小的也只缺你,你则取代最后的位置。
	for (int i = 0; i < n-1; i++)
	{
		if (tmp[i] > monotone.top())
		{
			monotone.push(tmp[i]); numst.push(1);
			sum += tmp[i];
		}
		else
		{
			//把相同的数组装起来了
			ll count = 1;
			while (tmp[i] < monotone.top())
			{
				sum -= monotone.top()*numst.top(); 
				count+=numst.top();
				monotone.pop(); numst.pop();
			}

			monotone.push(tmp[i]); numst.push(count);
			sum += tmp[i]*count;
		}
		ans = max(ans, sum);
	}

	cout << ans << endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/331841.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024最有发展潜力的代理项目!格行随身wifi代理项目分析测评,轻资产靠谱创业项目推荐

最近很多网友都有创业的想法&#xff0c;身边创业的朋友也不在少数&#xff0c;当然有成功的&#xff0c;也有亏的血本无归的。最近网上也有很多适合新手的创业或代理项目&#xff0c;什么单身经济啊&#xff0c;大健康啊还有创业圈一直在讨论的随身WiFi代理等。当然一些创投圈…

大文件的断点续传如何实现

断点续传 断点续传是一种数据恢复技术&#xff0c;主要用于在读取或发送数据时&#xff0c;因为网络问题、磁盘问题等原因导致数据传输中断。断点续传技术允许你在已经传输的数据基础上继续传输&#xff0c;从而节省数据传输时间。 断点续传通常用于文件传输过程中&#xff0c;…

由于找不到d3dcompiler_43.dll缺失,无法打开软件的解决方法分享

d3dcompiler43.dll是什么文件&#xff1f;为什么会出现丢失的情况&#xff1f;又该如何解决呢&#xff1f;本文将详细介绍d3dcompiler43.dll的作用和影响&#xff0c;并提供6个有效的解决方法。 一、d3dcompiler43.dll是什么文件&#xff1f; d3dcompiler43.dll是DirectX SDK…

SQL注入入门进阶_报错注入、延时注入、python脚本盲注

SQL注入入门进阶 学习目标 本篇文章入门SQL注入&#xff0c;除了回显的SQL注入还存在报错注入、布尔盲注和延时注入。如果sqlmap跑不出来的还可以使用burp intrude注入或者使用python编写脚本注入。 报错注入 concat() 函数的意思是讲&#xff0c;全部内容连成一个字符串&a…

书生·浦语大模型实战营第五节课笔记及作业

LMDeploy 大模型量化部署实践 1 大模型部署背景 1.1 模型部署及大模型特点 1.2 大模型部署挑战及方案 2 LMDeploy简介 2.1 核心功能-量化 2.2 核心功能-推理引擎TurboMind 2.1 核心功能-推理服务api server 3 动手实践及作业 按照文档LMDeploy 的量化和部署中的步骤在Intern…

【MIdjourney】一些材质相关的关键词

1.多维剪纸(Multidimensional papercut) "Multidimensional papercut"&#xff08;多维剪纸&#xff09;是一种剪纸艺术形式&#xff0c;通过多层次的剪纸技巧和设计来创造出立体感和深度感。这种艺术形式通常涉及在不同的纸层上剪裁不同的图案&#xff0c;并将它们…

鸿蒙开发-UI-布局-线性布局

鸿蒙开发-序言 鸿蒙开发-工具 鸿蒙开发-初体验 鸿蒙开发-运行机制 鸿蒙开发-运行机制-Stage模型 鸿蒙开发-UI 鸿蒙开发-UI-组件 鸿蒙开发-UI-组件-状态管理 鸿蒙开发-UI-应用-状态管理 鸿蒙开发-UI-渲染控制 鸿蒙开发-UI-布局 文章目录 前言 一、基本概念 二、布局子元素 1.子元…

大模型基础2

大模型基础2 第二章&#xff1a;大模型的能力 语言模型的适应性&#xff1a;从语言模型到任务模型的转化 语言模型转化为任务模型的过程称为"适应"&#xff1a; 任务的自然语言描述一组训练实例&#xff08;输入-输出对&#xff09; 进行适应的两个种方法&#xf…

OSI七层协议和五层协议

【 1 】互联网协议交互的基础 硬件设备 光缆 【 2 】OSI七层协议 物理层&#xff08;Physical Layer&#xff09;&#xff1a;负责传输比特流&#xff08;0和1&#xff09;以及物理连接的建立和维护。数据链路层&#xff08;Data Link Layer&#xff09;&#xff1a;提供可…

禅道下载安装及基本使用(项目周期管理)实施必会!!!

文章目录 前言&#xff1a;一、为什么要使用禅道&#xff1f;二、禅道的下载与安装 前言&#xff1a; 禅道的使用能使公司提高项目管理效率、促进团队协作、支持敏捷开发&#xff0c;并可根据具体需求进行个性化配置。 本文章博主将以一个项目周期来带你们了解禅道。 一、为什…

企业信息防泄漏管理的理念是什么?

在这个数字化的时代&#xff0c;信息数据的安全已经成为企业发展的关键要素。随着网络技术的飞速发展&#xff0c;信息安全的重要性日益凸显&#xff0c;它关乎企业的生死存亡。在企业的信息系统中&#xff0c;信息泄露是最常见和最严重的风险之一。因此&#xff0c;建立一套全…

django后台进行加密手机号字段,加密存储,解密显示

需求: 1 &#xff1a;员工在填写用户的手机号时&#xff0c;直接填写&#xff0c;在django后台中输入 2&#xff1a;当员工在后台确认要存储到数据库时&#xff0c;后台将会把手机号进行加密存储&#xff0c;当数据库被黑之后&#xff0c;手机号字段为加密字符 3&#xff1a;员…

Flutter编译报错Connection timed out: connect

背景&#xff1a;用Android Studo 创建了Flutter项目&#xff0c;编译运行报错java.net.ConnectException: Connection timed out: connect 我自己的环境&#xff1a; windows11 Android Studio Flutter 截图如下&#xff1a; 将错误日志展开之后&#xff1a; Exception…

银行家算法

文章目录 主要内容一.银行家算法1.需求分析 2.概要设计3.源代码代码如下&#xff08;示例&#xff09;: 总结 主要内容 一.银行家算法 1.需求分析 通过编写和调试一个系统动态分配资源的简单模拟程序&#xff0c;观察死锁产生条件&#xff0c;采用适当的算法&#xff0c;有效…

Java并发编程: 并发编程中的ExecutionException异常

一、什么是ExecutionException 在并发编程中在执行java.util.concurrent.Future实现类的get方法时&#xff0c;需要捕获java.util.concurrent.ExecutionException这个异常。Future.get()方法通常是要获取任务的执行结果&#xff0c;当执行任务的过程中抛出了异常&#xff0c;就…

WAF攻防相关知识点总结2-代码免杀绕过

WAF的检测除了有对于非正常的流量检测外还对于非正常的数据包特征进行检测 以宝塔为例 在宝塔的后台可以放置一句话木马的文件 宝塔不会对于这个文件进行拦截&#xff0c;但是一旦我们使用菜刀蚁剑等webshell工具去进行连接的时候&#xff0c;数据报中有流量特征就会被拦截 …

【十进制与二进制如何转换?推荐一个超好用的公式编辑器】

在计算机科学和电子工程中&#xff0c;二进制是一种非常重要的数字系统&#xff0c;因为它在数字处理和数据传输中被广泛使用。因此&#xff0c;理解如何将十进制数转换为二进制数是非常重要的。 可以使这个计算过程更加简单和快速。而且还可以用于其他数学方程式的编写和编辑。…

MAC磁盘空间不足怎么清理?MAC清理磁盘空间的五种方法

MAC磁盘空间不足怎么清理&#xff1f;当我们使用苹果MAC一段时间后&#xff0c;就会有大量的垃圾文件占用磁盘空间&#xff0c;例如系统缓存文件、应用程序缓存文件、备份和重复文件、旧版的应用程序及其部件等&#xff0c;为了不影响电脑的后续使用&#xff0c;我们需要经常清…

2. Git

2. Git Git简介 Git是什么&#xff1f; Git是目前世界上最先进的分布式版本控制系统&#xff08;没有之一&#xff09;。 Git有什么特点&#xff1f;简单来说就是&#xff1a;高端大气上档次&#xff01; 那什么是版本控制系统&#xff1f; 如果你用Microsoft Word写过长篇大…

IP定位助力网络安全防线

随着互联网技术的飞速发展&#xff0c;网络安全问题日益凸显。在网络安全领域&#xff0c;IP地址定位技术正发挥着越来越重要的作用&#xff0c;成为维护网络安全的一道有力防线。 一、追踪黑客攻击者&#xff0c;维护公共安全 在网络安全领域&#xff0c;黑客攻击是一个严重的…