t题目链接:http://codeforces.com/contest/1291/problem/B

思路:

用极端的情况去考虑问题,会变得很简单。

无论是单调递增,单调递减,或者中间高两边低的情况都可以变为三种模型。

(1)0,1,2,3,4……..

(2)n,n-1.n-2…….

(3)0,1,2,3,4,…..n…….4,3,2,1,0

那么,我们只需要查看当前位置是否大于等于极端模型(3)在这个位置的数值,如果当前位置不满足了,

那么我们就让当前位置和之后的数值去和极端模型(3)n后面递减的数值去比较,如果还有不满足的情况说明就是“NO”了。

注意一种情况 0 1 1 0需要特殊处理一下。

  1. 1 #include <iostream>
  2. 2 using namespace std;
  3. 3
  4. 4 const int N = (int)3e5+100;
  5. 5 int a[N];
  6. 6
  7. 7 int main(){
  8. 8
  9. 9 int T,n;
  10. 10 while(cin >> T){
  11. 11 while(T--){
  12. 12 cin >> n;
  13. 13 for(int i = 1; i <= n; ++i) cin >> a[i];
  14. 14 int i;
  15. 15 bool ok = 1;
  16. 16 //递增区间判断
  17. 17 for(i = 1; i <= n; ++i){
  18. 18 if(a[i] >= i-1) continue;
  19. 19 break;
  20. 20 }
  21. 21 // 0 1 1 0 这种情况判定
  22. 22 if(i <= n){
  23. 23 if(a[i] == a[i-1] && !(a[i] >= n-i+1)) ok = 0;
  24. 24 }
  25. 25 //递减区间判定
  26. 26 for(; i <= n; ++i){
  27. 27 if(a[i] >= n-i) continue;
  28. 28 ok = 0; break;
  29. 29 }
  30. 30 //if(ok) cout << "----------Yes" << endl;
  31. 31 //else cout << "----------No" << endl;
  32. 32 if(ok) cout << "----------Yes" << endl;
  33. 33 else cout << "----------No" << endl;
  34. 34 }
  35. 35 }
  36. 36
  37. 37 }

 

版权声明:本文为SSummerZzz原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/SSummerZzz/p/12259745.html