P3572 [POI2014]PTA-Little Bird

一只鸟从1跳到n。从1开始,跳到比当前矮的不消耗体力,否则消耗一点体力,每次询问有一个步伐限制k,求每次最少耗费多少体力


很简短的题目哼。

首先对于一个点, 他的状态一定是由前 \(k\) 个转移过来的。 \(k\) 的长度在每组询问内一定, 想到用单调队列维护 \(dp\) 。

不过此时单调队列里的元素有两个关键字: 劳累度和高度, 因为跳到比这个点高的树需要花费恒为一点体力(这个很重要), 所以我们维护单调队列的时候可以以劳累度为第一关键字, 高度为第二关键字进行比较, 为多个关键字的单调队列

解释一下为什么体力花费恒为一点很重要。 这里运用了一点贪心的思想: 此题的高度对体力消耗没有影响, 只有高和矮两种说法。 只要我的劳累值比你小, 不管你的高度有多低, 我 $ + 1$ 一定 \(<=\) 你, 所以可以把高度作为第二关键字比较, 从而不影响结果

Code

教训: 多次调用简单函数会大大降低算法的效率, 开一波 \(O2\) 才没 \(T\) 。

// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
int RD(){int flag = 1, out = 0;char c = getchar();while(c < '0' || c > '9'){if(c == '-')flag = -1;c = getchar();}while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}return flag * out;}
const int maxn = 1000019;
int len, num ,k;
int h[maxn];
int dp[maxn];
struct Que{int h, val, index;Que (int h, int val, int index): h(h), val(val), index(index){}Que(){};bool operator < (Que const &a)const{if(val != a.val)return val < a.val;return h > a.h;}}Q[maxn];
int head, tail;
void push_back(Que x){while(head <= tail && x < Q[tail])tail--;Q[++tail] = x;}
void check(int x){while(x - Q[head].index > k)head++;}
int get_min(){return Q[head].val;}
int main(){len = RD();for(int i = 1;i <= len;i++)h[i] = RD();num = RD();while(num--){k = RD();head = 1, tail = 0;Q[head] = Que(1e9 + 19, 0, 0);memset(dp, 0, sizeof(dp));for(int i = 1;i <= len;i++){check(i);if(h[i] < Q[head].h)dp[i] = get_min();else dp[i] = get_min() + 1;push_back(Que(h[i], dp[i], i));}printf("%d\n", dp[len]);}return 0;}

转载于:https://www.cnblogs.com/Tony-Double-Sky/p/9339048.html

P3572 [POI2014]PTA-Little Bird相关推荐

  1. 洛谷P3572 [POI2014]PTA-Little Bird

    P3572 [POI2014]PTA-Little Bird 题目描述 In the Byteotian Line Forest there are nn trees in a row. On top ...

  2. 【BZOJ 3831】【Poi2014】Little Bird(单调队列优化dp)

    题干: Description In the Byteotian Line Forest there are   trees in a row. On top of the first one, th ...

  3. 【BZOJ3831】[Poi2014]Little Bird 单调队列

    [BZOJ3831][Poi2014]Little Bird Description In the Byteotian Line Forest there are   trees in a row. ...

  4. C语言 之 PTA乙级错误集锦

    1,很大很大的数输入,并各位加和  PTA-1001 #include <stdio.h> #include <math.h> int main(){int sum=0,cou ...

  5. PTA数据结构与算法题目集6-4 6-3 6-8

    PTA数据结构与算法题目集(中文) 6-4 链式表的按序号查找 ElementType FindKth( List L, int K ){int index = 0;while(L){++index; ...

  6. PTA数据结构与算法题目集 6-9 二叉树的遍历

    PTA数据结构与算法题目集(中文) 6-9 二叉树的遍历 void InorderTraversal( BinTree BT ){if(BT==NULL)return;if(BT->Left){ ...

  7. PTA 家庭房产 (图论,暴搜)

    PTA 家庭房产 (图论,暴搜) 题目详情: 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤1000),随后N ...

  8. PTA—输出全排列 (20分) 递归回溯思想

    PTA-输出全排列 (20分) 递归回溯思想 题目要求: 请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间. 输入格式: 输入给出 ...

  9. 人形图案c语言程序_做游戏,学编程(C语言) 7 学习EasyX图形交互功能----flappy bird源代码...

    经过之前的学习,我们基本掌握了开发小游戏所需要的语法知识和搭建方法,但是基础C语言的可视化与交互功能实在是太弱了 . 利用免费的EasyX插件,我们可以快速上手,简单实现很酷的视觉效果 . EasyX ...

最新文章

  1. asp.net导出到Excel的最佳选择
  2. Office转PDF,Aspose太贵,怎么办?
  3. debian9为什么默认是pip2_Debian9 安装后基本配置
  4. jquery 如何动态添加、删除class样式方法介绍_jquery_脚本之家
  5. 黑鲨4游戏手机开启预热:4>5+6+7 比竞品更胜一筹
  6. linux 解压文件zip格式
  7. 单张图片上传预览【超简洁,未完待续】
  8. KDE桌面没有wifi的解决方案
  9. 西门子S7-1200系列PLC Modbus通信的踩坑记录
  10. U盘文件夹被病毒隐藏了
  11. CommonAPI 使用说明文档
  12. python冒号_python数组冒号取值操作
  13. 日记(菜的连比赛都参加不了)
  14. 客户细分是客户关系管理的重要手段
  15. (2)QlikView安装
  16. QT延时函数sleep
  17. IDEA的配置设置及使用
  18. 并查集——加边的无向图
  19. Oracle 常用的V$ 视图脚本
  20. mui native.js 调用本地视频播放器

热门文章

  1. MySql 数据库 - 重置数据库、重置初始密码方法,数据库初始化方法,长时间不用忘记密码暴力解决方法
  2. CTFshow 信息收集 web18
  3. pyqt5入门教程(五)
  4. java内存中的栈、方法区 、堆
  5. Windows 1.0 to Windows 10
  6. 数据插入INSERT
  7. linux下grub故障(使用光盘进入救援模式)
  8. rman datafile恢复(归档模式)
  9. dos下的edit命令使用详解
  10. Delphi XE5开发的Android启动时黑屏解决方法