题目:D. Discrete Centrifugal Jumps
分析:
![](https://i-blog.csdnimg.cn/blog_migrate/d012f398fd2d456d48f847d7c91ed548.png)
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define print(i) cout << "debug: " << i << endl
#define close() ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define mem(a, b) memset(a, b, sizeof(a))
const ll mod = 1e9 + 7;
const int maxn = 2e6;
const int inf = 0x3f3f3f3f;
int a[maxn];
int st1[maxn], st2[maxn];
int t1, t2;
int dp[maxn];
int main()
{
int n; cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
dp[1] = 0;
st1[++t1] = 1, st2[++t2] = 1;
for (int i = 2; i <= n; i++)
{
dp[i] = dp[i - 1] + 1;
while (t1 && a[i] <= a[st1[t1]])
{
t1--;
if(t1 && a[st1[t1 + 1]] > a[i]) dp[i] = min(dp[i], dp[st1[t1]] + 1);
}
st1[++t1] = i;
while(t2 && a[st2[t2]] <= a[i])
{
t2--;
if(t2 && a[st2[t2 + 1]] < a[i]) dp[i] = min(dp[i], dp[st2[t2]] + 1);
}
st2[++t2] = i;
}
cout << dp[n] << endl;
}