当前位置: 首页 > news >正文

[POI2014] PTA-Little Bird(单调队列优化 DP)

luogu 传送门icon-default.png?t=O83Ahttps://www.luogu.com.cn/problem/P3572

解题思路

先设 f(i) 表示到 i 的最小劳累值。

很容易得出转移:

f(i)=\min(f(j)/f(j)+1)

其中 f(j)/f(j)+1 由 d_i 和 d_{j} 的大小关系决定,并且 i-k\leq j <i

很显然,直接暴力是 O(n^2) 的,会超时

于是,考虑优化。

我们发现 j 是有一定的取值范围,并且我们取的是这个区间内的最小值。

也许这可以用单调队列优化

判断对头是否在范围内,如果不在即出队;

入队的时候,考虑队尾的劳累值是否大于当前的劳累值,如果大于,则队尾出队,如果队尾的劳累值等于当前的劳累值,我们可以比较谁的高度更高,保留更高的(因为更高的对后面的情况更优)。

于是,时间复杂度降为 O(nq)

代码

#include<bits/stdc++.h>
using namespace std;int n;
int d[1000001];
int qi;
int ki;
int f[1000001];
int q[1000001];
int head,tail;
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;for(int i=1;i<=n;i++){cin>>d[i];}cin>>qi;while(qi--){cin>>ki;head=1,tail=0;f[1]=0;q[++tail]=1;for(int i=2;i<=n;i++){while(head<=tail&&q[head]<i-ki)head++;if(d[i]>=d[q[head]])f[i]=f[q[head]]+1;elsef[i]=f[q[head]];while(head<=tail&&(f[q[tail]]>f[i]||(f[q[tail]]==f[i]&&d[q[tail]]<=d[i])))tail--;q[++tail]=i;} cout<<f[n]<<endl;}return 0;
}

http://www.lryc.cn/news/474175.html

相关文章:

  • 【含开题报告+文档+PPT+源码】基于SpringBoot的体育馆管理系统的设计与实现
  • Vue3学习:vue组件中的图片路径问题
  • openCV基础-图像预处理Day26
  • 给文件添加可读可写可执行权限
  • golang有序map
  • 【LangChain系列4】【Chain模块详解】
  • 51c嵌入式~IO合集1
  • ETLCloud怎么样?深度解析其在数据管理中的表现
  • 高频谐振功放电路
  • kafka如何获取 topic 主题的列表?
  • 全新大模型框架Haystack,搭建RAG pipeline
  • 儿童孤独症专家分享:了解治疗与支持的专业帮助
  • 初始JavaEE篇——多线程(7):定时器、CAS
  • 高精度计算(乘)
  • 在vue中 如何实现跨域
  • 计算机考研,选择西安交通大学还是哈工大?
  • 微积分复习笔记 Calculus Volume 1 - 4.4 The Mean Value Theorem
  • Cpp多态机制的深入理解(20)
  • (六)Python结构数据类型
  • C++进阶-->多态(Polymorphism)
  • python实战项目51:selenium结合requests获取某众点评评论
  • 面试准备第一版ssm spring-springmvc
  • Ubuntu学习笔记 - Day1
  • 挑战Java面试题复习第4天,坚持就是胜利
  • Android 虚拟化框架(AVF)指南
  • day-77 超级饮料的最大强化能量
  • 有道小P 1.0.8 | 完全免费的AI全科学习助手,家长的好帮手
  • vue项目中如何在路由变化时增加一个进度条
  • 如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令以及Vscode中的环境路径配置中找不到gcc
  • 3-petalinux2018.3 摸索记录 - 命令驱动 _ 交叉编译链