建议在洛谷查看题解。
第一眼看到这题,会想到暴力枚举每个 k。
但一看数据范围,O(N^2) 的算法肯定 TLE。
于是我们转变思路……
很显然,序列 a 为 0,1,……,n-1 时满足条件,为 n-1,n-2,……,0 时也满足条件。
所以,我们要找最后一个满足序列 a_1,a_2,……,a_l 严格单调递增的点 l 和第一个满足序列 a_r,a_r+1,……,a_n 严格单调递降的点 r。
若 l>=r,说明至少有一个点 k(r<=k<=l) 符合题意。
否则序列 a 不可能变成一个前半部分单调递增,后半部分单调递降的序列。
代码:
#include<bits/stdc++.h>
using namespace std;
void FIO(){
#define endl '\n'
#define int long long
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
int t,n,a[300010];
string ans[2]={"No\n","Yes\n"};
signed main(){
FIO();
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int l=0,r=n+1;
for(int i=1;i<=n;i++){
if(a[i]<i-1) break;
l=i;
}
for(int i=n;i>=1;i--){
if(a[i]<n-i) break;
r=i;
}
cout<<ans[(r<=l)];
}
return 0;
}