FoxSequence srm div2 mid

  • 端っこから順番に条件を満たすか調べていく。
  • 本番ではシステムテストで落ちた。
    • 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";
  }



};