Codeforces 319B Psychos in a Line 题解 [ 绿 ] [ 单调栈 ] [ 动态规划 ] [ adhoc ]

news/2025/1/7 9:44:40/文章来源:https://www.cnblogs.com/zhr0102/p/18653340

Psychos in a Line:很好的单调栈优化 dp 题!

观察

我们先观察,一个精神病人会一直杀到什么时候。显然,会杀到右边第一个比他大的精神病人那里,然后他就杀不动了。

因此我们可以从右往左考虑,算出左边的精神病人杀掉这个精神病人后左边的人的答案是什么。假设左边的人目前已经刀了 \(x\) 个人,被杀的人目前会\(y\) 个人。如果左边杀这个人的时候这个人该杀的还没杀完,那么左边人就要接着这个人继续把该杀的杀掉,又因为它们刀人是同步进行的,所以此时左边的人目前刀掉的人数取 \(\max(y,x+1)\)

于是,我们定义 \(dp_i\) 表示第 \(i\) 个人目前会刀几个人,然后 \(O(n^2)\) 转移即可。

优化

但是这样显然无法通过,考虑如何优化。

因为一个人会被他左边第一个比他大的人杀掉(不一定最后真的是被他杀的,如果他杀这个人之前就被杀了,那么情况还是等价的,不影响计算),所以我们从右到左维护一个单调栈,维护右边的最大值。在一个元素入栈的时候,只取弹出的元素转移即可。

时间复杂度 \(O(n)\),主要还是理解一个人先钦定被左边第一个比他大的人杀,之后再动态调整,不影响最终答案的类似反悔贪心的思想

代码

#include <bits/stdc++.h>
using namespace std;
int n,a[100005],dp[100005],tp=0,s[100005],ans;
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int i=n;i>=1;i--){int res=0;while(tp&&a[s[tp]]<a[i])res=max(res+1,dp[s[tp--]]);s[++tp]=i;dp[i]=res;ans=max(dp[i],ans);}cout<<ans;return 0;
}

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

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

相关文章

【嵌入式编程】内存分布

一、内存分布图在操作系统中,内存被组织和管理以支持进程的运行。以下是一些常见的内存分布概念: 【内核空间】:操作系统内核使用的内存区域,用于存储内核代码、数据结构和进程控制块(PCB)。【用户空间】:存储用户的代码。未初始化变量区(.bss):存放未初始化的全局变量…

北京健康证(立水桥地铁站附近)

体检:记得带身份证就可以,最好自带一支笔,用他的笔要排队,我买的是96的,带培训证的。 下面这个表只填:身份证号,手机号,姓名就可以,类别、是否培训以交钱时候前台登记的为准,照片也不采集,直接用身份证上的相片

北京健康证

体检:记得带身份证就可以,我买的是96的,带培训证的。 下面这个表只填:身份证号,手机号,姓名就可以,类别以交钱时候前台登记的为准,照片也不采集,直接用身份证上的相片

anaconda安装与环境配置

一、Anaconda简介 ​ Anaconda 是专门为了方便使用 Python 进行数据科学研究而建立的一组软件包,涵盖了数据科学领域常见的 Python 库,并且自带了专门用来解决软件环境依赖问题的 conda 包管理系统。主要是提供了包管理与环境管理的功能,可以很方便地解决多版本python并存、…

java学习报告

Java学习报告 目录 第一章 初识java与面向对象程序设计 1 第二章 java编程基础 3 第三章 面向对象程序设计(基础) 13 第四章 面向对象程序设计(进阶) 15 第五章 异常 17 第六章 java常用类 1720 初识java与面向对象程序设计Java概述计算机编程语言发展史“计算机之父”冯诺…

PyTorch Geometric框架下图神经网络的可解释性机制:原理、实现与评估

在机器学习领域存在一个普遍的认知误区,即可解释性与准确性存在对立关系。这种观点认为可解释模型在复杂度上存在固有限制,因此无法达到最优性能水平,神经网络之所以能够在各个领域占据主导地位,正是因为其超越了人类可理解的范畴。 其实这种观点存在根本性的谬误。研究表明…

25. K 个一组翻转链表(难)

目录题目法一、模拟--迭代法二、递归 题目给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值,而…

OpenWrt 系统UCI详解(Lua、C语言调用uci接口实例)

1 UCI简介 “uci"是"Unified Configuration Interface”(统一配置界面)的缩写,用于OpenWrt整个系统的配置集中化。 很多后台服务有自己的配置文件,并且配置文件格式都不相同,OpenWrt系统中需要开启各种服务,为了解决配置不兼容的问题,统一采用uci格式的配置文件。…

macbook 双系统win7忘密码 解决办法 通用

1开机出现以下图片按开机键强制重启2选择这一个3跟着选择4等待时间较长5继续678点击计算机9选择c盘10选择Windows进入system32文件夹11右键修改名字 将sethc 修改为sethc112然后键盘上输入cmd13将cmd名字修改为sethc 14关掉所有点击完成 15然后开机来到登录界面 按5次shift 次数…

GoLang 2024 安装激活详细使用教程(激活至2026,实测是永久,亲测!)

开发工具推荐:GoLang 安装激活详细使用教程(激活至2026,实际上永久,亲测!)申明:本教程 GoLang 补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 ! GoLang是JetBrains公司推出的一款功能强大的GO语言集成…

数值计算方法(3) 数值微分方法

+++ date = 2024-12-21T15:45:47+08:00 draft = true title = 数值计算方法(3) 数值微分方法 +++ 初次发布于我的个人文档 上一期讲了数值积分方法,这一次自然是要讲数值微分方法的,不然太不完善了。 更何况数值微分方法其实是基于数值积分方法得到的。 我们先从比较简单的估…

.Net NativeAOT另外一种选择-bflat

https://www.qiufengblog.com/articles/dotnet-native-bflat.html前言 说起bflat,还得先说NativeAOT,在.Net 7时,正式把NativeAOT合到Runtime中,地位是明显上升了,对NativeAOT的代码提交也越来越多了,之前还是corert时,几年也没有太大的进展. 这个时候的成果还是有ILC(ILCompil…