しずくぶろぐ

競技ぷろぐらみんぐしたり、なんかしたりします

不定期解説記事企画 ARC018 B #雫ぷよ

 こんにちは、研究室のミーティングで論文紹介をしたら人にものを伝える技術が絶望的にないことが分かった綿谷雫です。 解説記事を書いたら人に伝わる文章が書けるようになるかもしれないので、今日は解説記事を書いてみたいと思います。

続きを読む

入出力をできるようにしよう #雫ぷよ

Fortranでやっていると、入出力ができないせいでパフォーマンスが伸びないということがあるのでまとめました

入力:基本

私は基本

integer a,b
read*,a,b

のようにread*,で読み込んでいます。ここはread(*,*)などいろんな読みこませ方をする人がいます。*はなんかうまいこと読み込んでおいてくれといった意味合いです。
よくある

5
1 2 3 4 5

と先に配列の大きさが与えられてそのあとに要素が一列で与えられるものは

integer N
integer,allocatable,dimension(:)::P
read*,N
allocate(P(N))
read*,P

という感じに読み込んでいます。
例えばこういう問題とか
atcoder.jp

大変だった入力1

列の先頭に配列の大きさが与えられてその真後ろに要素が一列で与えられるもの
atcoder.jp
この場合allocateしている暇がないので余裕を持たせた配列を準備しておいて読ませます。*1
例えば

4 1 1 1 1

というものであれば

integer k
integer reader(10)
read*,k,reader(1:k)

とやると読み込ませることが可能です。

大変だった入力2

これは滅多にないと思うんですが0*で始まる文字列をread*,で読み込むとエラーを起こします。
ちなみにここで出てきました。
atcoder.jp
これはread*,で式を読み込むのではなく

character(10**5) S
read"(A)",S

と形式を指定して読み込ませてやるとうまくいきます。

追記.
全くの空白を読み込ませてくるときも同様です。
yukicoder.me

大変だった入力3

Query を受け取る際、行の途中まで読み込んで、また続きから読み込みたいときがあると思います。
そのときは、read(*,"(A)",advance="no")として読み込ませます。
ここで出てきました。
atcoder.jp

read(*,"(A)",advance="no") Q1

これでクエリが複数出てくる問題にも対応できそうです。

これに限らず型の指定をきっちりした方がミスなく読み込みやすいかもしれません。

出力:基本

大抵はprint"(A)"かprint"(i0)"で済みます。print*でうまくいくときもありますが、怖いので毎回形式を整えています。print"(I0)"が整数用でprint"(A)"が文字列です。

integer N
character(3) S
N=3
S="ABC"
print"(i0)",N
print"(A)",S
end

こんな感じです。
他にもwrite文使っている人などがいます。

特殊な出力1

出力するものが実数のときは

print"(f0.10)",bo

のようにやります10のところを大きくすると出てくる桁数が大きくなります。

atcoder.jp

特殊な出力2

配列をスペース一字空けで出力するとき

atcoder.jp
このときはprint文ではなくwrite文を使いました。

write(*,'(i0)', advance='no') A(1)
do i=2,len_trim(S)
  write(*,'(x,i0)', advance='no')A(i)
end do
write(*,*)

こんな感じです。advance='no'で改行しないようにしています。最後のwrite(*,*)は改行の為に必要です、多分。

特殊な出力3

100を000100など桁数が足りない分を0で埋めたいとき

atcoder.jp
これは12桁でした

  print"(i12.12)",ans

*1:実際これしか方法がないのかは詳しくないので断言できないけど

水色になりました(Fortranで) #雫ぷよ

ABC139で色が水色に変わりました。清涼感あっていいですね。

f:id:kapt0nH:20190902143835p:plain
わーい

水色になるまでにやったこと

557(Fortranでは556問)解いたらしいです。
f:id:kapt0nH:20190902144342p:plain

f:id:kapt0nH:20190902144437p:plain
textしか使えない問題をひとつ出してしまいました

A問題とかB問題のように簡単なものを多く解いているので人よりも精進量が多く見えるかもしれません。

f:id:kapt0nH:20190902144632p:plain

だんだん埋まってるの見るの楽しいですよね。

バーチャルコンテスト? みたいなのにはまだ参加していません。そろそろ参加してみよっかなぁ。

Fortranで水色になる為に必要だったと思われること

水色になる為に必要だと感じられたもののうち他のいわゆる今風の言語を使う人が躓かないだろうところを書きます。もう水色になるのに必要だったこととかは色々みんな書いてるので*1

機能

Fortranは(C++,Pythonに比べて)わかりやすい分、色々な機能がないので自分で作る必要があります。一番よく使うのはsortでしょうか。計算量のオーダーがO(NlogN)のsortは準備しておくべきです。流石にいちいち書いてると時間が足りないので。私はヒープソートを使っています。

他にない機能としてはqueueとかpriority queue とかもないのですが、これは準備してなくても水色にはなれると思います。私もつい最近ue1221さんのQiitaの記事*2見ながらほぇ〜って言いながらやったばっかりです。ほぇ〜。

入出力

入出力をきちんとできるようにしておくと解ける問題が増えます。あとでまとめます。水色の前の一回レートが下がっているところは入出力のせいで下がったと言っても過言ではない、、、

今後について

そろそろ他の言語も使うべきか悩んでいたんですが、最近やっとオブジェクト指向みたいなのの意味がほんのりわかってきた(ような気がする)し、typeが使えそうな問題が出てきたりしているのでもう少し続けてみよっかなーと思います。まだまだ、Fortranにできないこともはっきりしていないですしね。

夏休みにやりたいこと

いよいよテスト週間が始まり、夏休み中にやりたいことが色々出てくるようになりました。

 

はてなぶろぐからも何か書けとメールがきたのでとりあえずやりたいと思ったことを取り留めもなく書いていきます

  • シケプリ作りを例にTeXの使い方を適当にまとめたpdf よく使うコマンドとかそういうのをまとめたい パッケージはこれを使うとか
  • 輪講で扱った論文の基礎となるペニーコックさんの論文とかそういうのを2日に一本くらい読みたい。
  • 来期のシケプリを確認しておく。
  • AtCoderで解こうと思ってる問題を解く。DPとかtypical とか。
  • 体を動かす。
  • 積ん読消化。
  • あとカクヨムでなんか書くとかするのもいいかも。

 

こんぐらいかな。とりあえずだらけてないで動いていたい(願望)

この文、携帯で書いたんですけど、案外色々できるものですね。指疲れるからそんなやりたいものではないですけど。

好きな問題がありました #雫ぷよ

解いてみて、これ好き〜ってなる問題があったので書きます。
これ好き〜ってなった問題はAtCoder Beginner Contest 099のC問題,Strange Bankです。
ネタバレされたくない人は先に解いてください。

atcoder.jp

続きを読む