《P3572 [POI 2014] PTA-Little Bird》

题目描述

有 n 棵树排成一排,第 i 棵树的高度是 di​。

有 q 只鸟要从第 1 棵树到第 n 棵树。

当第 i 只鸟在第 j 棵树时,它可以飞到第 j+1,j+2,⋯,j+ki​ 棵树。

如果一只鸟飞到一颗高度大于等于当前树的树,那么它的劳累值会增加 1,否则不会。

由于这些鸟已经体力不支,所以它们想要最小化劳累值。

输入格式

第一行输入 n。

第二行 n 个数,第 i 个数表示 di​。

第三行输入 q。

接下来 q 行,每一行一个整数,第 i 行的整数为 ki​。

输出格式

共 q 行,每一行输出第 i 只鸟的最小劳累值。

输入输出样例

输入 #1复制

复制代码
9
4 6 3 6 3 7 2 6 5
2
2
5

输出 #1复制

复制代码
2
1

说明/提示

1≤n≤106,1≤di​≤109,1≤q≤25,1≤ki​≤n−1。

代码实现:

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
#define rep(i,s,t) for(int i=s;i<=t;i++)
using namespace std;

const int N=1e6+114;

int n,d[N],q,f[N],k[N],que[N],h=0,t=0;

signed main() {
    cin>>n;
    for(int i=1;i<=n;i++)cin>>d[i];
    cin>>q;
    while(q--) {
        int x;cin>>x;h=t=1;que[t]=1;
        for(int i=2;i<=n;i++) {
            while(h<=t && i-que[h]>x)h++;
            if(d[que[h]]>d[i])f[i]=f[que[h]];
            else f[i]=f[que[h]]+1;
            while(h<=t && (f[i]<f[que[t]] || f[i]==f[que[t]] && d[que[t]]<=d[i]))t--;
            que[++t]=i;
        }
        cout<<f[n]<<endl;
    }
    return 0;
}
相关推荐
Smilecoc1 分钟前
决策树(一):决策树基本原理
算法·决策树·机器学习
weixin_307779133 分钟前
从工具到协作者:AI在后端研发中的流程重构与组织赋能
人工智能·后端·python·算法·自动化
沉下去,苦磨练!13 分钟前
深度学习神经网络的搭建
人工智能·算法
孬甭_26 分钟前
深入剖析快速排序:原理、实现与性能优化
数据结构·算法·排序算法
阿正的梦工坊41 分钟前
【Rust】06-函数、控制流与模块组织
开发语言·算法·rust
阿正的梦工坊1 小时前
【Rust】16-async/await、Future 与执行器模型
网络·算法·rust
阿正的梦工坊1 小时前
【Rust】11-Rust 所有权模型的编译期推理机制
开发语言·算法·rust
风筝在晴天搁浅1 小时前
LeetCode CodeTop 88.合并两个有序数组
算法·leetcode·职场和发展
GuWen_yue1 小时前
吃透二叉树与递归!60分钟掌握树结构核心+解题思路
javascript·算法
happymaker06261 小时前
LeetCodeHot100——3.无重复字符的最长子串
算法