《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;
}
相关推荐
tankeven1 小时前
HJ101 排序
c++·算法
流云鹤1 小时前
动态规划02
算法·动态规划
小白菜又菜1 小时前
Leetcode 236. Lowest Common Ancestor of a Binary Tree
python·算法·leetcode
不想看见4041 小时前
01 Matrix 基本动态规划:二维--力扣101算法题解笔记
c++·算法·leetcode
多恩Stone1 小时前
【3D-AICG 系列-12】Trellis 2 的 Shape VAE 的设计细节 Sparse Residual Autoencoding Layer
人工智能·python·算法·3d·aigc
踢足球09292 小时前
寒假打卡:2026-2-23
数据结构·算法
田里的水稻2 小时前
FA_建图和定位(ML)-超宽带(UWB)定位
人工智能·算法·数学建模·机器人·自动驾驶
Navigator_Z2 小时前
LeetCode //C - 964. Least Operators to Express Number
c语言·算法·leetcode
郝学胜-神的一滴2 小时前
Effective Modern C++ 条款40:深入理解 Atomic 与 Volatile 的多线程语义
开发语言·c++·学习·算法·设计模式·架构