题解:极限考虑一下,问题会变成三种情况:
1,数组变成0,1,2,3,4,5,......,n-2,n-1(如果有一个数a[i]<i-1,就不行)
2,数组变成n-1,n-2, ......,5,4,3,2,1,0(如果有一个数a[i]<n-i,就不行)
3,数组变成0,1,2,3..... k ...... ,3,2,1,0
接下来就简单了;
从前向后扫一遍数组,标记一下,在从后往前扫一遍数组在标记一下,如果能交到一起就可以,否则就不行。
scanf输入,cin会超时
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define maxx 1010
const int maxn=3e5+10;
int l[maxn],r[maxn],n;
long long a[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
scanf("%d",&n);
for(int i=1; i<=n; i++) scanf("%lld",&a[i]);
for(int i=1; i<=n; i++)
{
if(a[i]>=i-1)
l[i]=1;
else
break;
}
for(int i=n; i>=1; i--)
{
if(a[i]>=n-i)
r[i]=1;
else
break;
}
bool flag=0;
for(int i=1; i<=n; i++)
{
if(l[i]&&r[i])
flag=1;
}
if(flag) printf("YES
");
else printf("NO
");
}
return 0;}