From a06b6bd8d70f7f0c6e0501cd14472b94fa48e4e2 Mon Sep 17 00:00:00 2001 From: hanyixuanten Date: Tue, 27 Oct 2026 01:47:39 +0000 Subject: [PATCH] new file: P3572.cpp --- P3572.cpp | 25 +++++++++++++++++++++++++ P3572.md | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 P3572.cpp create mode 100644 P3572.md diff --git a/P3572.cpp b/P3572.cpp new file mode 100644 index 0000000..c1a4f37 --- /dev/null +++ b/P3572.cpp @@ -0,0 +1,25 @@ +#include +using namespace std; +int n, k, q, d[1000005], f[1000005]; +typedef pair pii; +pair qq[4000005]; +int lq = 1, rq = 0; +int main() +{ + scanf("%d", &n); + for (int i = 1; i <= n; i++) + scanf("%d", &d[i]); + scanf("%d", &q); + while(q--){ + scanf("%d", &k); + lq = 1, rq = 1; + qq[1] = {0, 1}; + for(int i = 2; i <= n; ++i) { + while(lq <= rq && qq[lq].second < i - k) ++lq; + f[i] = qq[lq].first + (d[qq[lq].second] <= d[i]); + while(lq <= rq && (qq[rq].first > f[i] || (qq[rq].first == f[i] && d[qq[rq].second] <= d[i]))) --rq; + qq[++rq] = {f[i], i}; + } + printf("%d\n", f[n]); + } +} diff --git a/P3572.md b/P3572.md new file mode 100644 index 0000000..d6ea7ab --- /dev/null +++ b/P3572.md @@ -0,0 +1,52 @@ +# P3572 [POI 2014] PTA-Little Bird + +## 题目描述 + +有 $n$ 棵树排成一排,第 $i$ 棵树的高度是 $d_i$。 + +有 $q$ 只鸟要从第 $1$ 棵树到第 $n$ 棵树。 + +当第 $i$ 只鸟在第 $j$ 棵树时,它可以飞到第 $j+1, j+2, \cdots, j+k_i$ 棵树。 + +如果一只鸟飞到一颗高度大于等于当前树的树,那么它的劳累值会增加 $1$,否则不会。 + +由于这些鸟已经体力不支,所以它们想要最小化劳累值。 + +## 输入格式 + +第一行输入 $n$。 + +第二行 $n$ 个数,第 $i$ 个数表示 $d_i$。 + +第三行输入 $q$。 + +接下来 $q$ 行,每一行一个整数,第 $i$ 行的整数为 $k_i$。 + +## 输出格式 + +共 $q$ 行,每一行输出第 $i$ 只鸟的最小劳累值。 + +## 输入输出样例 #1 + +### 输入 #1 + +``` +9 +4 6 3 6 3 7 2 6 5 +2 +2 +5 + +``` + +### 输出 #1 + +``` +2 +1 + +``` + +## 说明/提示 + +$1 \le n \le 10^6$,$1 \le d_i \le 10^9$,$1 \le q \le 25$,$1 \le k_i \le n - 1$。 \ No newline at end of file