情感理论(单调栈模拟)

news/2024/7/24 9:13:06 标签: 算法

题目链接:问题 1940 | 程序设计在线评测平台 (ldu.edu.cn)

题目描述

叶妍霜正在研究一个关于人类情感的数学理论,她最近的研究是将每一天的情感值以一个非负整数表示为一个数组序列arr[],现在她要找出一个区间[L,R],使得(arr[L]+…+arr[R])×arr[k]的值最大,其中arr[k]为区间[L,R]中的最小值。

输入描述

第一行为一个整数N,表示有N个(1≤N≤100000)情感值,第二行为N个情感值( 0到10^6之间)。

输出描述

第一行为最大值,第二行为L和R的位置。、


可以把这个问题抽象为求最大矩形面积,我们把arr[i]看作一个边长为arr[i]的正方形,那么对于区间[L,R]中的最小值就可以看成是区间可以构建矩形的最大高。构建单调不递减栈来实现这个问题的求解。

#include<bits/stdc++.h>
using namespace std;

#define Pqueue priority_queue
#define lc p<<1
#define rc p<<1|1
#define IOS ios::sync_with_stdio(false),cin.tie(0);
#define fi first
#define se second

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> PII;

const int mod = 1000000007;
const int N = 1e6 + 10;
const int inf = 0x3f3f3f3f;
const ll P = 131;

stack<ll> num, pos, len;
// num-单调不降栈   pos-位置栈   len-矩形长度栈
int arr[N], l, r;
ll n, mx;

/*void DEbug(stack<ll>& s) {
	stack<ll> tmp;
	while (!s.empty())
		tmp.push(s.top()), s.pop();
	while (!tmp.empty()) {
		cout << tmp.top() << " ";
		s.push(tmp.top());
		tmp.pop();
	}
	cout << "\n";
}*/
void solve() {
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> arr[i];
	arr[n + 1] = -1;//arr>=1 -1<=arr
	for (int i = 1; i <= n+1; i++) {//n+1使得栈置空
		ll tmp = 0;					//记录长度
		int L = i;					//记录位置
		while (!num.empty() && arr[i] <= num.top()) {
			tmp += len.top();
			if (mx < tmp * num.top()) {
				mx = tmp * num.top();
				r = i - 1;			//r为i-1位
				l = pos.top();		//l为pos顶部
				//cout<<i<<" ";
				//DEbug(pos);
				//DEbug(num);
			}
			L=pos.top();			//更新最左边界
			pos.pop();
			num.pop();
			len.pop();				//出栈
		}
		pos.push(L);
		num.push(arr[i]);
		len.push(tmp + arr[i]);		//入栈
	}
	cout << mx << "\n" << l << " " << r;
}

int main() {
	IOS
	int T = 1;
	//cin>>T;
	while (T--)
		solve();
	return 0;
}

/*
oxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxox
x                                                                                      o
o       _/_/_/_/                                                              _/       x
x      _/                                                                              o
o     _/_/_/_/ _/  _/_/   _/_/   _/_/_/ _/_/   _/_/_/     _/_/    _/_/_/    _/ _/   _/ x
x    _/       _/_/     _/    _/ _/   _/   _/  _/    _/ _/    _/  _/    _/  _/   _/ _/  o
o   _/       _/       _/    _/ _/   _/   _/  _/    _/ _/    _/  _/    _/  _/    _/_/   x
x  _/       _/         _/_/   _/   _/   _/  _/_/_/     _/_/ _/ _/    _/  _/      _/    o
o                                          _/                           _/      _/     x
x                                         _/                        _/_/       _/      o
o                                                                                      x
xoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxo
*/


http://www.niftyadmin.cn/n/5036764.html

相关文章

数据结构与算法(四)--队列

一、前言 前面的文章我们分别学习了线性结构中的数组和栈&#xff0c;这次我们学习另一种线性结构–队列。队列同栈&#xff0c;依然是把数据排成一排&#xff0c;且队列对应的操作依旧是数组的子集。但是队列只能从一端&#xff08;队尾&#xff09;添加元素&#xff0c;只能…

git硬重置(hard reset)重找回

首先进行git版本回退 1、git log查找历史commit_id git log2、版本回退 git reset --hard commit_id3、找回你的提交(commit), 因为Git对每件事都会有日志&#xff0c;且都会保存几天。 git reflog4、选择你想要回到的提交(commit)的SHA&#xff0c;再重置一次: git reset --h…

Kafka 集群与可靠性

文章目录 Kafka集群的目标Kafka集群规模如何预估Kafka集群搭建实战Kafka集群原理成员关系与控制器集群工作机制replication-factor参数auto.leader.rebalance.enable参数 集群消息生产可靠的生产者ISR&#xff08;In-sync Replicas&#xff09;使用ISR方案的原因ISR相关配置说明…

【xshell和xftp连接Ubuntu教程】

一、下载xshell和xftp 下载地址 https://www.xshell.com/zh/free-for-home-school/ 二、连接xshell 输入ip&#xff0c;端口号 输入用户名&#xff0c;密码 出现这个使用就行了 三、连接xftp 同上&#xff0c;输入ip&#xff0c;端口&#xff0c;用户名&#xff0c;密码 连接成…

Spring Boot 自动注入失败的原因

问题 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type com.sveinn.chatbotdomain.zsxq.service.ZsxqApi available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {ja…

MySQL 索引(一)

1.数据访问方式 在 MySQL 中&#xff0c;通常有两种方式访问数据库表的行数据&#xff1a;顺序访问和索引访问。 1.1.顺序访问 顺序访问是在表中实行全表扫描&#xff0c;从头到尾逐行遍历&#xff0c;直到在无序的行数据中找到符合条件的目标数据。实现比较简单&#xff0c…

YOLO物体检测-系列教程5:YOLOV3源码解读2之 模型创建函数

&#x1f388;&#x1f388;&#x1f388;YOLO 系列教程 总目录 上篇内容&#xff1a; YOLOV3项目实战1之 整体介绍与数据处理 YOLOV3提出论文&#xff1a;《Yolov3: An incremental improvement》 4、模型创建 4.1 模型创建函数 模型创建函数 位置&#xff1a;项目 / util…

leetcode25 K个一组反转链表

题目 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部…