《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;
}
相关推荐
liminla!10 分钟前
SQL 从入门到进阶:语法速查与实战练习(完整优化版)
数据库·sql·算法
维克兜率天1 小时前
【维克】指数调整:哪些股票会被“强制买入“?
人工智能·python·算法
罗西的思考2 小时前
【轻量化复刻大模型】线性注意力交互式演示
人工智能·算法·机器学习
神也畏惧菠萝2 小时前
Day08 Python流程控制从入门到上瘾:if/match/while/for四件套,从B站登录一路打到猜数字游戏
python·算法·数据存储·for·while·if·ifelse
揽星河..2 小时前
【C语言】分支和循环
c语言·c++·算法
Fuyo_11194 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
jktantan4 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
揽星河..5 小时前
【C语言】猜数字游戏
c语言·算法·游戏
LabVIEW开发5 小时前
CTM-3 红外测温仪 + LabVIEW 温度怎么测?
算法·labview·测试·labview程序