t题目连接:http://codeforces.com/contest/1291/problem/Bios
思路:spa
用极端的状况去考虑问题,会变得很简单。code
不管是单调递增,单调递减,或者中间高两边低的状况均可以变为三种模型。blog
(1)0,1,2,3,4........n-3,n-2,n-1ci
(2)n-1,n-2,n-3.....3,2,1,0get
(3)0,1,2,3,4,.....n.......4,3,2,1,0io
那么,咱们只须要查看当前位置是否大于等于极端模型(3)在这个位置的数值,若是当前位置不知足了,class
那么咱们就让当前位置和以后的数值去和极端模型(3)n后面递减的数值去比较,若是还有不知足的状况说明就是“NO”了。test
注意一种状况 0 1 1 0须要特殊处理一下。stream
1 #include <iostream> 2 using namespace std; 3 4 const int N = (int)3e5+100; 5 int a[N]; 6 7 int main(){ 8 9 int T,n; 10 while(cin >> T){ 11 while(T--){ 12 cin >> n; 13 for(int i = 1; i <= n; ++i) cin >> a[i]; 14 int i; 15 bool ok = 1; 16 //递增区间判断 17 for(i = 1; i <= n; ++i){ 18 if(a[i] >= i-1) continue; 19 break; 20 } 21 // 0 1 1 0 这种状况断定 22 if(i <= n){ 23 if(a[i] == a[i-1] && !(a[i] >= n-i+1)) ok = 0; 24 } 25 //递减区间断定 26 for(; i <= n; ++i){ 27 if(a[i] >= n-i) continue; 28 ok = 0; break; 29 } 30 //if(ok) cout << "----------Yes" << endl; 31 //else cout << "----------No" << endl; 32 if(ok) cout << "----------Yes" << endl; 33 else cout << "----------No" << endl; 34 } 35 } 36 37 }