单调栈/单调队列训练记录 2025.2

大概套路:

条件:问题可以拆成一些部分之和的最值,且互不干涉,转移范围是一定的,而且要么可直接转移,要么具有可差分性

Cashback

https://www.gxyzoj.com/d/hzoj/p/4376

结论只推到一定是 \(c\) 的倍数或是小于等于 \(c\),但是其实在长度超过 \(c\) 的时候一定是越短越好

因为长度变长,最小值可能变小,所以可以直接分为两种情况

记当前点去掉的数之和最大为 \(f_i\),因为长度小于 \(c\) 时一定是无用的,直接从 \(f_{i-1}\) 转移即可

对于长度恰好为 \(c\) 的,可以找 \(i-c+1\)\(i\) 的最小值,单调队列维护即可

Cutlet

https://www.gxyzoj.com/d/hzoj/p/4382

这道题有两维限制,朴素的,设 \(f_{i,j}\) 表示当前是第 \(i\) 个时刻,未被煎的一面的时长为 \(j\)

但是注意到,不属于区间的点是可以统一计算的,所以只用考虑区间内

又注意到,其实翻 0,1,2 次就是所有的情况了,因为可以把不与前后相连的同一面朝下时间连一起

所以将 \(i\) 的意义改为第 \(i\) 个区间即可

但是背包转移的时间复杂度大,因为是连续的,考虑单调队列

0 直接转移,2 因为朝上面不变,所以只考虑加上了多少

1 比较复杂,假设区间长度为 \(x\),右端点为 \(r\),那么转移范围就是 \(r-j-x\)\(r-j\)

注意,这里 \(j\) 要倒着枚举

点击查看代码
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k,l[105],r[105],q[200005],f[105][200005],tail,head;
int main()
{scanf("%d%d",&n,&k);n=n*2;for(int i=1;i<=k;i++){scanf("%d%d",&l[i],&r[i]);}for(int i=0;i<=k;i++){for(int j=0;j<=n;j++){f[i][j]=1e9;}}f[0][0]=0;for(int i=1;i<=k;i++){for(int j=0;j<=n;j++){f[i][j]=f[i-1][j];}head=1,tail=0;int x=r[i]-l[i];for(int j=0;j<=r[i];j++){if(head<=tail&&q[head]<j-x) head++;while(head<=tail&&f[i-1][q[tail]]>f[i-1][j]) tail--;q[++tail]=j;f[i][j]=min(f[i][j],f[i-1][q[head]]+2);}head=1,tail=0;for(int j=r[i];j>=0;j--){if(head<=tail&&q[head]<r[i]-j-x) head++;int tmp=r[i]-j;while(head<=tail&&f[i-1][q[tail]]>f[i-1][tmp]) tail--;q[++tail]=tmp;f[i][j]=min(f[i][j],f[i-1][q[head]]+1);}}if(f[k][n/2]!=1e9)printf("Full\n%d",f[k][n/2]);else printf("Hungry");return 0;//
}

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

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

相关文章

get current user

02 - 从SpringSecurity中获取当前用户 一行搞定 SecurityContextHolder.getContext().getAuthentication().getPrincipal();这里自定义了一个UserDetailsImpl类实现UserDetails接口, 此时loadUserByUsername方法的返回对象的类型也要改成自定义类型(01篇最后那样), 不然报错。测…

自编译Frp 实现二次开发

在使用过程中,我们都是利用作者打包好的包,直接使用。但是现实中,我们可能需要对其进行二开。 因而,本文简单的为大家介绍下frp的二次开发。以修改frps dashboard为例。现在让我们一起来学习吧。修改之前的界面修改后效果 安装GO环境 因为,Frp是基于GO开发的,所以我们需要…

从黑盒到透明:AI Agent 运行监控实战!

你是否遇到过这样的情况:辛辛苦苦开发的 AI Agent 突然失灵了,却不知道是哪个环节出了问题?今天给家人们分享一下如何让 AI Agent 的运行过程透明化。 一、为什么要监控 AI Agent? 传统的对话系统就像一张预先画好的地图,用户只能按照既定路线前进。而 AI Agent 则像是一位…

[2025.2.23] 周记

引言在这周的面试当中,我遇到了几个不是很清楚的题目,回家之后进行学习发现了一些比较有意思的事情,在这里记录一下 这周还发现了一个很有帮助的Java知识网站:Java 基础 - 面向对象 | Java 全栈知识体系1.字符串和常量池 在这次面试当中遇到的一个原题就是 String i = "i&…

YOLOv5 的量化及部署 - RGB 专题

技术背景 YOLOv5 是一种高效的目标检测算法,尤其在实时目标检测任务中表现突出。YOLOv5 通过三种不同尺度的检测头分别处理大、中、小物体;检测头共包括三个关键任务:边界框回归、类别预测、置信度预测;每个检测头都会逐像素地使用三个 Anchor,以帮助算法更准确地预测物体…

Java基础学习(十七)

Java基础学习(十七):网络编程 目录Java基础学习(十七):网络编程概念IP端口号协议UDP 通信TCP 通信 本文为个人学习记录,内容学习自 黑马程序员概念定义:在网络通信协议下,不同计算机上运行的程序进行的数据传输 常见的软件架构:C/S 和 B/SC/S:Client/Server,在用户…

最小费用最大流问题的 SSP 算法

我们已经了解最大流问题,其目标是通过网络中的各条边传输流量,尽可能地从源点流向汇点。通过经典的算法,如 Ford-Fulkerson 增广,我们能够找到一种方式,最大化从源点到汇点的流量。 然而,最大流问题的基本形式并没有考虑流动的成本。一个图的最大流值是一个固定数,可以由…

逆向软件设计-扫雷(C语言)

本人选用了舍友开发的C语言扫雷游戏用以学习逆向软件设计,环境为vs2022 在该程序中,代码被分成了三个部分,分别是game的头文件和源文件,以及test的源文件 在game的头文件中,代码主要包括了游戏的基本信息和函数 #include<stdio.h> #include<stdlib.h> #includ…

将一个数组旋转 k 步

题目:将一个数组旋转 k步。如输入一个数组[1,2,3,4,5,6,7] 和 k = 3, 即旋转 3步。输出 [5,6,7,1,2,3,4] 解题思路:思路1: 把k 后面的元素,挨个pop,然后unshif 到数组前面 思路2: 将 k 后面的所有数据拿出来作为 part1 将 k前面的所有数据拿出来作为part2 返回 part1.conca…

bge-large-zh-v1.5 和 bge-reranker-large模型有什么区别和联系

BGE(BAAI General Embedding)系列模型是智源研究院开发的高性能语义表征工具,其中bge-large-zh-v1.5和bge-reranker-large是两类不同功能的模型。它们的区别和联系如下:核心区别功能定位bge-large-zh-v1.5:属于Embedding模型,主要用于将文本(如句子或段落)转换为高维向…

整数二分查找

整数二分 二分的本质不是单调性 有单调性一定可以二分 可以二分不一定有单调性 二分的本质是边界 -1记得+1 +1不用再补