题意:给定一个初始序列,你可以让序列的任何一个数字减小(注意只能减少不能上升),问能不能有办法通过减少一些数字把整个序列变成先递增后递减的序列。
思路:定义两个指针i,j,i从前往后扫,看看序列能不能大于0 1 2 3 4 5,而j从后往前扫变成5 4 3 2 1 0,看看i和j最后停下来的位置,如果j的位置大于i的话,说明i到j这一段中有数字是不能再减少的,一定是不符合题意的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=3e5+10;
int main()
{
int T,n,flag,a[maxn];
scanf("%d",&T);
while(T--)
{
flag=0;
scanf("%d",&n);
int k=n;
for(int i=0;i<n;++i) scanf("%d",&a[i]);
for(int i=0;i<n;++i)
{
if(a[i]<i) {k=i;break;}
}
//cout<<k<<endl;
for(int i=n-1,j=0;i>=0;--i,++j)
{
if(a[i]<j)
{
if(i+1>k-1) flag=1;
//cout<<"i=="<<i<<"k=="<<k<<endl;
break;
}
}
printf("%s\n",flag?"No":"Yes");
}
}