↓ 提出AC
Submission #8506903 - AtCoder Grand Contest 013
int main() { cout <<setprecision(10); int n ; cin >> n; vector<int> a(n); rep(i,n) cin >> a[i]; bool up = false , down = false; int ans = 1; for(int i = 1; i< n ; i++){ if(up){ if(a[i-1] > a[i]){ up = down = false; ans++; } }else if(down){ if(a[i-1] < a[i]){ up = down = false; ans ++; } } else{ if(a[i-1] == a[i]){ //何もしなくていい }else if(a[i-1] < a[i]){ up = true; down = false; } else{ up = false; down = true; } } } cout << ans << endl; }
実装系の問題ですか?多分。
a[i] がa[i-1]と一緒のときは単調非減少かつ単調非増減なので特に何もしなくていいですね。
それ以外のとき、今単調非減少を見ているのか単調非増減を見ているのかを記憶しておく。
っていうのを実装させるのが結構めんどくさいので多分実装系の問題ですね。
で、まあ、一回ai < ai+1 < ai+2 > ai+3 ってなったら数列の区切りを一個増やさなくちゃいけないので増やす
、ai+4 とai+3の関係(=ならai+5 or ai+6...)`を見て 今見てるのが単調非減少か単調増減化を見る。って感じですね
それを実装すると↑のコードになります。(ACなのでそう)