《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;
}
相关推荐
维克兜率天23 分钟前
【维克】动量指标家族:RSI、ROC、CCI、Momentum全面解析
python·算法
AI情绪识别开源1 小时前
检信 AI 智能推广平台(代号:JX-Promote)
人工智能·算法·erlang
老当益壮梁奶奶2 小时前
Linux软件编程学习笔记(八):进程间通信详解(1)
linux·c语言·笔记·学习·算法
不会就选b2 小时前
算法日常・每日刷题--<BFS拓扑排序>4
算法
不正经学生2 小时前
C语言动态内存管理(上):堆上的自由与责任
c语言·开发语言·c++·算法·面试
伟大的车尔尼2 小时前
贪心的概念
数据结构·算法·贪心
方方洛2 小时前
vllm教程-00-前言与导读
人工智能·算法·vllm
IT毕设实战小研3 小时前
电影数据可视化推荐系统
大数据·后端·爬虫·python·算法·信息可视化·课程设计
且随疾风前行.3 小时前
从驱动来分析服务的添加过程
算法
CoderYanger3 小时前
A.每日一题:输入单词需要的最少按键次数 Ⅰ+Ⅱ
java·数据结构·算法·leetcode·面试