算法日记10:SC62求和(单调栈)(共享求解)

一、题目

在这里插入图片描述

二、题解:

1、首先,我们看到题目的第一个想法,就是把样例答案如何求解给列出来,图例如下

在这里插入图片描述

2、通过分析样例,可以很清晰的发现每一个数字都有其管辖的区间,因此我们可以想到能否找到一个数字它所管辖区间的左端点和右端点

在这里插入图片描述

3、以5来举例,可以发现它一共管辖了 3 ∗ 3 3*3 33个区间,所以它对答案的贡献 9 ∗ 5 = 45 9*5=45 95=45

在这里插入图片描述

  • 3.1:因此,我们可以简单算出样例答案
    在这里插入图片描述

4、但是,会出现一种出现重复数字的情况

  • 比如,在下面这个样例中:就会出现管辖区间分配的特殊情况
    在这里插入图片描述
  • 这时,我们就需要规定一个明确的规则,(也就是规定好给谁,这里以左闭右开为例),也就是说我们规定,如果一个区间有重复元素,那么我们就把这个区间给靠右的元素,但是这个用代码如何实现呢?
    在这里插入图片描述

5、我们可以用单调栈的思想的解决,找到左边第一个<=a[i]的值(因为等于也归它管,但是<就不归它管了),//找到右边第一个<a[i]的值(因为<=都不归它管)

//找到左边第一个<=a[i]的值ll top=0;for(int i=1;i<=n;i++){while(top&&a[stk[top]]>a[i]) //栈不为空/栈顶元素>a[i]{top--;  //栈顶元素出栈}if(top==0) l[i]=0; //表示左边没有<=的数else l[i]=stk[top];stk[++top]=i;   //入栈}//找到右边第一个<a[i]的值top=0;for(int i=n;i>=1;i--){while(top&&a[stk[top]]>=a[i]) //栈不为空/栈顶元素>=a[i]{top--;  //栈顶元素出栈}if(top==0) r[i]=n+1; //表示右边边没有<=的数else r[i]=stk[top];stk[++top]=i;   //入栈}

6、区间求解原理(数学原理)

  • 在最后一步,我们使用sum+=a[i]*(i-l[i])*(r[i]-i)来求解,其实这非常好证明,如下:
    在这里插入图片描述
  • 以2举例,我们可以清晰看到证明过程
  • 这个点的贡献= a [ i ] ∗ ( i − l ) ∗ ( r − i ) a[i]*(i-l)*(r-i) a[i](il)(ri)
a[i]-->这个点的值
l-->左边第一个>a[i]的下标值
r-->右边第一个>=a[i]的下标值

三、完整代码如下

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
const int N = 2e5 + 7;
ll a[N];
ll stk[N];
ll l[N], r[N]; //模拟单调栈,存储下标void solve()
{int n; cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];//找到左边第一个<=a[i]的值ll top=0;for(int i=1;i<=n;i++){while(top&&a[stk[top]]>a[i]) //栈不为空/栈顶元素>a[i]{top--;  //栈顶元素出栈}if(top==0) l[i]=0; //表示左边没有<=的数else l[i]=stk[top];stk[++top]=i;   //入栈}//找到右边第一个<a[i]的值top=0;for(int i=n;i>=1;i--){while(top&&a[stk[top]]>=a[i]) //栈不为空/栈顶元素>=a[i]{top--;  //栈顶元素出栈}if(top==0) r[i]=n+1; //表示右边边没有<=的数else r[i]=stk[top];stk[++top]=i;   //入栈}ll sum=0;for(int i=1;i<=n;i++)   //遍历相乘{sum+=a[i]*(i-l[i])*(r[i]-i);}cout<<sum<<'\n';
}int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int _ = 1; //cin >> _;while (_--) solve();system("pause");return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Revit二次开发 自适应族添加放样融合

大多数博客给出的方案都是如何在有自适应族的情况下进行修改定位点或是将数据传入自适应族,如何直接在族文件中创建自适应模型并将点转换为自适应点,连接自适应点成为自适应路径这种方式没有文章介绍. 下面的代码中给出了如何在自适应族文件中创建参照点并转换为自适应点连接…

基于VMware的ubuntu与vscode建立ssh连接

1.首先安装openssh服务 sudo apt update sudo apt install openssh-server -y 2.启动并检查ssh服务状态 到这里可以按q退出 之后输入命令 &#xff1a; ip a 红色挡住的部分就是我们要的地址&#xff0c;这里就不展示了哈 3.配置vscode 打开vscode 搜索并安装&#xff1a;…

解决SetWindowCompositionAttribute使控件文本透明的问题

用以下参数调用该API&#xff0c;能实现类似Aero的模糊透明效果。 参数具体含义见 https://zhuanlan.zhihu.com/p/569258181 http://www.memotech.de/WindowComposition/Text.txt http://www.memotech.de/WindowComposition/WindowComposition.zip DWORD accent[4] { 3,0,0,0 …

使用 DeepSeek-R1 与 AnythingLLM 搭建本地知识库

一、下载地址Download Ollama on macOS 官方网站&#xff1a;Ollama 官方模型库&#xff1a;library 二、模型库搜索 deepseek r1 deepseek-r1:1.5b 私有化部署deepseek&#xff0c;模型库搜索 deepseek r1 运行cmd复制命令&#xff1a;ollama run deepseek-r1:1.5b 私有化…

SQL入门到精通 理论+实战 -- 在 MySQL 中学习SQL语言

目录 一、环境准备 1、MySQL 8.0 和 Navicat 下载安装 2、准备好的表和数据文件&#xff1a; 二、SQL语言简述 1、数据库基础概念 2、什么是SQL 3、SQL的分类 4、SQL通用语法 三、DDL&#xff08;Data Definition Language&#xff09;&#xff1a;数据定义语言 1、操…

Java篇之继承

目录 一. 继承 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 访问父类成员 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. super和this关键字 7. 子类构造方法 8. 代码块的执行顺序 9. protected访问修饰限定符 10. 继承方式…

使用SpringBoot发送邮件|解决了部署时连接超时的bug|网易163|2025

使用SpringBoot发送邮件 文章目录 使用SpringBoot发送邮件1. 获取网易邮箱服务的授权码2. 初始化项目maven部分web部分 3. 发送邮件填写配置EmailSendService [已解决]部署时连接超时附&#xff1a;Docker脚本Dockerfile创建镜像启动容器 1. 获取网易邮箱服务的授权码 温馨提示…

TensorFlow简单的线性回归任务

如何使用 TensorFlow 和 Keras 创建、训练并进行预测 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与预测 7. 保存与加载模型 8.完整代码 1. 数据准备与预处理 我们将使用一个简单的线性回归问题&#xff0c;其中输入特征 x 和标…

vue入门到实战 三

目录 3.1 v-bind 3.1.1 v-bind指令用法 ​编辑3.1.2 使用v-bind绑定class 3.1.3 使用v-bind绑定style 3.2.1 v-if指令 3.2.1 v-if指令 3.2.2 v-show指令 ​3.3 列表渲染指令v-for 3.3.1 基本用法 3.3.2 数组更新 3.3.3 过滤与排序 3.4 事件处理 3.4.1 使用v-on指令…

《苍穹外卖》项目学习记录-Day10订单状态定时处理

利用Cron表达式生成器生成Cron表达式 1.处理超时订单 查询订单表把超时的订单查询出来&#xff0c;也就是订单的状态为待付款&#xff0c;下单的时间已经超过了15分钟。 //select * from orders where status ? and order_time < (当前时间 - 15分钟) 遍历集合把数据库…

解决MacOS安装软件时提示“打不开xxx软件,因为Apple无法检查其是否包含恶意软件”的问题

macOS 系统中如何开启“任何来源”以解决安装报错问题&#xff1f; 大家好&#xff01;今天我们来聊聊在使用 macOS 系统 时&#xff0c;遇到安装应用软件时出现报错的情况。这种情况常常发生在安装一些来自第三方开发者的应用时&#xff0c;因为 macOS 会默认阻止不明开发者的…

【FreeRTOS 教程 六】二进制信号量与计数信号量

目录 一、FreeRTOS 二进制信号量&#xff1a; &#xff08;1&#xff09;二进制信号量作用&#xff1a; &#xff08;2&#xff09;二进制信号量与互斥锁的区别&#xff1a; &#xff08;3&#xff09;信号量阻塞时间&#xff1a; &#xff08;4&#xff09;信号量的获取与…

C++模板编程——可变参函数模板之折叠表达式

目录 1. 什么是折叠表达式 2. 一元左折 3. 一元右折 4. 二元左折 5. 二元右折 6. 后记 上一节主要讲解了可变参函数模板和参数包展开&#xff0c;这一节主要讲一下折叠表达式。 1. 什么是折叠表达式 折叠表达式是C17中引入的概念&#xff0c;引入折叠表达式的目的是为了…

DeepSeek回答禅宗三重境界重构交易认知

人都是活在各自心境里&#xff0c;有些话通过语言去交流&#xff0c;还是要回归自己心境内在的&#xff0c;而不是靠外在映射到股票和技术方法&#xff1b;比如说明天市场阶段是不修复不接力节点&#xff0c;这就是最高视角看整个市场&#xff0c;还有哪一句话能概括&#xff1…

数据结构【链栈】

基于 C 实现链表栈&#xff1a;原理、代码与应用 一、引言 栈就是一个容器&#xff0c;可以当场一个盒子&#xff0c;只能一个一个拿&#xff0c;一个一个放&#xff0c;而且是从上面放入。 有序顺序栈操作比较容易【会了链栈之后顺序栈自然明白】&#xff0c;所以我们这里只…

成绩案例demo

本案例较为简单&#xff0c;用到的知识有 v-model、v-if、v-else、指令修饰符.prevent .number .trim等、computed计算属性、toFixed方法、reduce数组方法。 涉及的功能需求有&#xff1a;渲染、添加、删除、修改、统计总分&#xff0c;求平均分等。 需求效果如下&#xff1a…

C++:抽象类习题

题目内容&#xff1a; 求正方体、球、圆柱的表面积&#xff0c;抽象出一个公共的基类Container为抽象类&#xff0c;在其中定义一个公共的数据成员radius(此数据可以作为正方形的边长、球的半径、圆柱体底面圆半径)&#xff0c;以及求表面积的纯虚函数area()。由此抽象类派生出…

Java面试题2025-并发编程基础(多线程、锁、阻塞队列)

并发编程 一、线程的基础概念 一、基础概念 1.1 进程与线程A 什么是进程&#xff1f; 进程是指运行中的程序。 比如我们使用钉钉&#xff0c;浏览器&#xff0c;需要启动这个程序&#xff0c;操作系统会给这个程序分配一定的资源&#xff08;占用内存资源&#xff09;。 …

AI智慧社区--百度地图

数据库&#xff1a; 前端实现 页面代码 <template><div class"app-container"><baidu-map class"bm-view" :center"center" :zoom"zoom" ready"initMap"><!-- 定位 --><bm-geolocation anchor…

WSL2中安装的ubuntu搭建tftp服务器uboot通过tftp下载

Windows中安装wsl2&#xff0c;wsl2里安装ubuntu。 1. Wsl启动后 1&#xff09;Windows下ip ipconfig 以太网适配器 vEthernet (WSL (Hyper-V firewall)): 连接特定的 DNS 后缀 . . . . . . . : IPv4 地址 . . . . . . . . . . . . : 172.19.32.1 子网掩码 . . . . . . . .…