题目链接
https://codeforces.com/contest/1291/problem/B
最小为0,且相邻不重复,只能减不能加
从左往右,第一个数最小是0,第二个数最小是1…
将满足的dpl[i]令为true,直到第一个不满足跳出
从右往右,第一个数最小是0,第二个数最小是1…
后面同理
若存在i,使得dpl[i]==true&&dpr[i]==true,则有峰
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
ll t;
cin >> t;
while (t--) {
ll m;
cin >> m;
vector<int>a;
vector<bool>dpl(m, false);
vector<bool>dpr(m, false);
while (m--) {
ll temp;
cin >> temp;
a.push_back(temp);
}
m = a.size();
for (int i = 0; i < m; i++) {
if (a[i] < i)break;
dpl[i] = true;
}
for (int i = m - 1; i >= 0; i--) {
if (a[i] < m - i - 1)break;
dpr[i] = true;
}
int flag = 0;
for (int i = 0; i < m; i++)
{
if (dpl[i] && dpr[i])
{
flag = 1;
break;
}
}
if (flag)cout << "YES" << endl;
else
cout<<"NO"<<endl;
}
}