- 端っこから順番に条件を満たすか調べていく。
- 本番ではシステムテストで落ちた。
- seq2の最初の要素が正であるかのチェックを忘れていた。
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
#include <utility>
#include <set>
#include <cctype>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iterator>
using namespace std;
bool isPos(int x){
return x > 0;
}
bool isNeg(int x){
return x < 0;
}
bool isNotNeg(int x){
return x >= 0;
}
bool allEqual(vector<int>::iterator b, vector<int>::iterator e){
if((e - b) == 1){
return true;
}
for(vector<int>::iterator i = b + 1; i != e; i++){
if(*i != *b){
return false;
}
}
return true;
}
class FoxSequence{
public:
string isValid(vector <int> seq){
string ret;
int n = seq.size();
vector<int> seq2(n - 1);
for(int i = 0; i < n - 1; i++){
seq2[i] = seq[i + 1] - seq[i];
}
if(seq2[0] <= 0) return "NO";
vector<int>::iterator a = find_if(seq2.begin(), seq2.end(), isNeg);
if(a == seq2.end()) return "NO";
if(!allEqual(seq2.begin(), a)) return "NO";
vector<int>::iterator b = find_if(a + 1, seq2.end(), isNotNeg);
if(b == seq2.end()) return "NO";
if(!allEqual(a, b)) return "NO";
vector<int>::iterator c;
if(*b == 0){
c = find_if(b + 1, seq2.end(), isPos);
if(!allEqual(b, c)) return "NO";
}
else{
c = b;
}
vector<int>::iterator d = find_if(c + 1, seq2.end(), isNeg);
if(d == seq2.end()) return "NO";
if(!allEqual(c, d)) return "NO";
if(!allEqual(d, seq2.end())) return "NO";
return "YES";
}
};