3250
id:Ozy:20070711#p2から。
とりあえず、問題を単純に実装してみる。
c,s[80001],j; main(v){ gets(s); for(*s=8e9;~scanf("%d",&v);c+=j,s[++j]=v) while(s[j]<=v)--j; printf("%u",c); }
最初の*s=8e9は番兵。
あとは生きている数字をsに突っ込んでいって、その数を計算するだけ。
さて、冗長な書き方を短縮するためのイディオムを適当に注入していく。
まず二重ループの展開とgetsの削除
最初は簡単にargcをフラグにする
c,s[80001],j,v; main(i){ for(*s=8e9;v<s[j]? i--<0?c+=j,s[++j]=v:0,~scanf("%d",&v):~--j;); printf("%u",c); }
しかし、考えてみればargcを使わんでも配列のサイズをフラグにすればいいか。
で、配列のサイズを使うならついでに番兵も削除。
s[80002],j; main(c){ while(j<3|*s<s[j] ?c+=j++-2,s[j]=*s,~scanf("%d",s) :--j); printf("%u",c+2); }
まぁこんなんで良いかな?
+2だとか-2だとか冗長そうなので短縮出来そうな気もする