SRM498 250pt: FoxSequence

問題概要

ある数列が^-^な形をしているか確かめる問題。

解法

実装するだけとしか言いようがない。階差数列作ってからやると楽になるけど本質的にはやってることに変わり無し。

感想

ある問題が解けなかったとき、悔しいと感じるならまだ良い方で、落ちたときに溜め息しか出ないようなのは本当に虚しい。単純なミスを減らす方法について一度真面目に見当する必要があるような。
下のコードは修正済みでAcceptされたものだけど、vectorに範囲外アクセスする可能性がある。as[-1]なら多分高確率でセグフォるだろうけど、as[as.size()]なら大丈夫だよね?本当かな?、とコンテスト中に再提出するかどうかずっと悩んでいた(落ちた原因はそこではないけど)。as[as.size()]の部分はas.end()であって欲しいと思うけど、どうなっているんだろう。

string isValid(vector <int> seq) {
    int N = seq.size();
    int i,dif;
    int a,b,c,d;
    for(i=0;i<N&&seq[i]<seq[i+1];i++); a = i;
    for(i=a;i<N&&seq[i]>seq[i+1];i++); b = i;
    for(i=b;i<N&&seq[i]==seq[i+1];i++); c = i;
    for(i=c;i<N&&seq[i]<seq[i+1];i++); d = i;
    if(!(0<a && a<b && b<=c && c<d && d<N-1)) return "NO";
    dif = seq[1] - seq[0];if(dif<=0) return "NO";
    for(i=0;i<a;i++)if(seq[i+1]-seq[i]!=dif) return "NO";
    dif = seq[a+1] - seq[a];if(dif>=0) return "NO";
    for(i=a;i<b;i++)if(seq[i+1]-seq[i]!=dif) return "NO";
    for(i=b;i<c;i++)if(seq[i+1] != seq[i]) return "NO";
    dif = seq[c+1] - seq[c];if(dif<=0) return "NO";
    for(i=c;i<d;i++)if(seq[i+1]-seq[i]!=dif) return "NO";
    dif = seq[d+1] - seq[d];if(dif>=0) return "NO";
    for(i=d;i<N-1;i++)if(seq[i+1]-seq[i]!=dif) return "NO";
    return "YES";
}