Codeforces Round #616 (Div. 2) B. Array Sharpening
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 #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 }