《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;
}
相关推荐
刀法如飞16 分钟前
Agentic AI时代,程序员必备的算法思想指南
人工智能·算法·agent
刀法如飞19 分钟前
Agentic AI时代程序员必备算法思想详解(附实战案例)
算法·ai编程·编程开发·agentic
飞Link1 小时前
告别盲目找Bug:深度解析 TSTD 异常检测中的预测模型(Python 实战版)
开发语言·python·算法·bug
记忆多1 小时前
c++名字空间 函数模版 左右值
开发语言·c++·算法
三伏5222 小时前
控制理论前置知识——相平面数学基础2(示例部分)
算法·平面·控制
2401_889884662 小时前
高性能计算通信库
开发语言·c++·算法
不想看见4043 小时前
Hamming Distance位运算基础问题--力扣101算法题解笔记
算法
像污秽一样3 小时前
算法与设计与分析-习题4.1
算法·链表·排序算法
lhc200906253 小时前
【作业】 贪心算法
算法·贪心算法
天若有情6733 小时前
循环条件隐藏陷阱:我发现了「同循环双条件竞态问题」
c++·学习·算法·编程范式·while循环··竞态