ラベル Codeforces参戦記 の投稿を表示しています。 すべての投稿を表示
ラベル Codeforces参戦記 の投稿を表示しています。 すべての投稿を表示

2013/10/14

Codeforces Round #206(Div.2) 参戦記

出題やら時間が合わないやらの理由で、およそ半月ぶりのコンテスト参加となったのが今回のCodeforces Round #206。リハビリがてらのつもりでしたが、蓋をあけてみると…。

<参戦記>
取り敢えずAを読んで、すぐに答えを思いついたので、答えを書いて提出、一発Passed。ちょっと遅かったかな?と思いつつBを読むと、これもまたやるだけで、同じぐらいの時間で一発Passed。という事で、Cにうつる。読んでみて、DPなどせずとも直接式を出せそうだったので、計算式を出す。似たような総和計算が必要ということで、尺取り法で計算させて間に合うようにしてアップし、一発Passed。この段階で、Dを解いている人が少なかったので、Eに行くが、Eの間に合う解が見つからない。Dも全然わからない。諦めて、Standingsを見ていると、終了直前にEは100人以上がPretest Passed。
「え、これEだよな?割と虐殺が起こるのでは?」と思っていると、約1割しか通らない虐殺が起きて、順位が一気に上がりました。Systest前後でこれだけ順位が変わったのは久しぶりな気がします。

<Aの題意>
ある非負整数に対し、各位の総和を取る。この操作を、再度その総和に取る。これを繰り返すと、最終的には1桁の自然数となる。丁度$k$桁の自然数のうち、この操作の結果が$d$となるような数を1つ出力せよ。ただし、そのような数が存在しない場合は"No solution"と出力せよ。$k$は1000以下、$d$は0以上9以下。

<Aの解き方と感想>
入力例などにひっかかって難しく考えるとドツボにはまります。
最初に$d$を出力し、そのあと0を$k$回出力すれば終わりです。ただし、$d=0$かつ$k>1$の場合は、"No solution"です。
スマートな解をぱっと思いつくかどうかが勝負という感じです。

<Bの題意>
ある町には$n$のバス路線と、$m$のトロバス路線がある。この路線には、4種類の切符があり、次の通りである。

1.任意の路線に1回だけ乗れる切符。$c_1$という額で販売されている。
2.任意の1路線に好きなだけ乗れる乗り放題切符。$c_2$という額で販売されている。
3.バス路線ないしトロバス路線のみの乗り放題切符。バス路線版は全バス路線に、トロバス路線版は全トロバス路線に好きなだけ乗れる。いずれも$c_3$という額で販売されている。
4.全ての路線に好きなだけ乗れる乗り放題切符。$c_4$という額で販売されている。

ここまでの各パラメータと、バス路線の利用回数が入力される時、最安コストを求めるプログラムを作成せよ。

<Bの解き方と感想>
順に比較するだけです。まず、1の切符で路線毎に額を計算し、2の切符に置き換えるべき路線は2の切符に置き換えます。これにより、バス路線全体のコストとトロバス路線全体のコストが出るので、3の切符と比較して、置き換えるべきなら置き換えます。最後に両方のコストを足して、これが4の切符より高いなら4の切符に置き換えます。

似たような構造が3回ある問題で、2回にしてもおそらく問題としては成り立ちますが、実装量を稼ぐという観点からしても、これぐらいでいいのかなと思います。

<Cの題意>
$n$個の品物があり、各々の重さは$w_i$である。今、あるロボットにこの品物を全て取ってもらう。ロボットが出来る操作は「現在最も左側にある品物を左手で取る」「現在最も右側にある品物を右手で取る」の2種類である。ロボットが左手で$i$番目の品物をとった場合、$l\times w_i$のエネルギーコストがかかる($l$は定数)。同じく、右手で$j$番目の品物をとった場合、$r\times w_j$のエネルギーコストがかかる($r$は定数)。また、連続して同じ手を使った場合には余分なエネルギーコストがかかる。左手を連続して使った場合は都度$Q_l$のエネルギーコストが、右手の場合都度$Q_r$のエネルギーコストがかかる。各パラメータが与えられる時、エネルギーコストを最小化せよ。

<Cの解き方と感想>
左手で$N_l$個の品物を取る場合、右手で取るのは$n-N_l$個であり、このときどの品物がどちらの手に取られるかは一意に定まります。つまり、左側から$N_l$個目までは左手に取られ、他は右手に取られます。したがって、かかる連続コストの総和を$Q_s$とする時、全ての品物を取るのに必要なエネルギーコストは
\[
\sum^{N_l}_{k=1} lw_k +\sum^{n}_{k=N_l+1} rw_k + Q_s
\]
により計算できます。更に、$Q_s$は、左手と右手の回数がわかっている時、それをできるだけ交互に使うという戦略により簡単に最小値を求めることができます。
(多い側の回数-少ない側の回数-1)に、$Q_l,Q_r$のいずれか(多い側に対応しているもの)をかければ、$Q_s$になります。

先の式の総和部分に尺取り法を使えば、時間についても特にビクビクすることはないでしょう。直接導き出しましたが、DPの人も多かったようで、またその答えも見てみたいところです。

<結果のまとめ等>
ooo--,2730点,21位/1682人で、Ratingは1646->1753!初のDiv.1昇格となりました。が、正直次回から戦える気がしません…。
問題原文はこちら
記念撮影


2013/01/29

Codeforces Round #164(Div.2) 参戦記

今年初のCodeforcesです。ケアレスミスが痛かった。

A:やるだけ。

B:総和の計算をすると、(n-1)n(n+1)/6+nという公式が出てくるので、これを出力するだけなんですが、注意すべきはオーバーフロー。私、オーバーフローを考えるの忘れてました。

C:条件から、同一x座標/y座標の点は存在しないことがわかります。そして、x,y軸と45度をなす直線上においてやれば良いです。(0,0)は使えないので、右下がりの直線にしてやればOKです。

oxo--,684位/1882人(Official),1804点,レートは1547->1494、Round#141以来の緑落ちでした。問題はこちら

2012/10/08

Codeforces Round #143(Div.2) 参戦記

できた回です。問題はこちら


A:文法の練習問題で、歴代最速提出をマークしました。各行に入る1,0の列のうち、1が2個以上ある列は幾つ有りますか?という問題ですね。

B:この問題のほうがDより難しいのではないのかな?という問題でした。数列の奇数項の総和-偶数項の総和をdにすればよいので、総和が適切な範囲に持ってこれるかどうかを考えて、配列に分配しました。

C:ソート+しゃくとり法です。昇順ソートした後、a[i]に揃えるために必要な和の回数及びその時揃えられる個数をしゃくとり法で計算すればOKです。

D:見掛け倒しです。見る位置と各面の位置関係を列挙するだけです。

oooo-,27位/2347人,4190点,レートは1516->1696でした。惜しくもDiv.1届かず!ですが、Div.1で戦える自信はないので、これでよかったのかもしれません。

2012/09/25

復活! CC Septemer Cook & CF Round #140(Div.2)

半年以上間があいてしまいましたが、久しぶりに記事を書きます!英語を書く気が失せたので、当面の間日本語のみにします。AtCoderとかも書くようにしますね!今後とも宜しくお願いします。

CodeChef September Cook (2012)
ハッキングされて、少し重くなっていたとのことでしたが、普段自分の端末が遅い場合が多いので気にせず参加しました。CodeChefが重いのか、e-mobileが重いのか、わからずじまいです。

数分たってから、解いた人が見える問題を解きました。問題はこちら

Carvans:前から順に数えるだけです。「現在の速度」を記録しておいて、それ以下の速度の車があればそれをカウントし、「現在の速度」を更新します。

Recipe Reconstruction:文字列を前後両方からペアで見ていきます。もしも回文になっていなければ数を0倍、両方が?ならば26倍、他の場合は1倍すればOKです。文字数が奇数の場合、真ん中の文字が?ならば更に26倍する必要があります。

Ratingが上がりました。1316->1577です(小数点以下四捨五入)。

Codeforces Round #140 (Div.2)
Round #133以来の参加で、ひさしぶりだったのが災いしたか、今ひとつでした。Eは解けなかったのですが、それっぽいアルゴリズムを導出したので、備忘録として書いておきます。問題はこちら

A:ベクトルの変化を考えるだけの問題なのですが、何故か手こずりました。落ち着いて計算しないといけません。まっすぐ行ってるかどうかは傾きを比較すればよいだけです。左右の判定が少し面倒で、A-B間のベクトルを90度回転させた時、その回転させたベクトルとB-C間のベクトルとの符号を比べなければなりませんでした。それでも未だどこかミスがあるようです(^^;

B:与えられる1-nの並び替え配列に対し、前側から線形探索した場合と後側から線形探索した場合のどちらが速くなるかを考える問題です。単純にリニアサーチすると当然間に合いませんので、格納方法を逆引きにしてやります。つまり、配列a[i]は、数字iが何番目に入っているか、を示すものとします。後は、前側からならa[i]回、後側からならn-a[i]+1回という計算をするだけです。

C:ハノイの塔です。ただし、通常のハノイの塔と違うのは「隣の塔にしか移動できない」という事です。漸化式を立ててとけば、求めるべき値が3^n-1という事になりますから、繰り返し二乗法を用いれば終わりです。

E:フィボナッチ数F_nに対して、gcd(F_n,F_m)=F_(gcd(n,m))が成立します。これは一般化可能で、k個のフィボナッチ数に対し、その最大公約数はその添字の最大公約数Gに対し、F_Gにより与えられます。ここで、Gの条件として区間[l,r]中にk個以上Gの倍数がなければなりません。これを逆に考えると、G=r/k-l/kにより求められます(演算はintで考えてください)。後は求めたGに対してフィボナッチ数を計算すれば良い…筈なのですが、残り時間ではフィボナッチ数の高速計算は書けず(行列の繰り返し二乗法ぐらいライブラリ化しておけばよかったのですが)、時間不足で解けませんでした。

結果:xox--でした。

2012/02/25

Codeforces Round #109(Div.2) 参戦記

お久しぶりです。

Round#101以来、およそ1ヶ月半ぶりに参加したCodeforcesです。いわゆるReadforcesだった気がする回でした。

A: 文法の練習問題という感じで、配列の最大と最小を求めるのとほとんど変わらない問題でした。6分でACとなり、488点をとりました。そしてこれが、今回の唯一の正解です。

B: はじめて出したときには配列の初期化を忘れており、それから2度再提出して、無事にpretest passed...だったのですが、ランタイムエラー(test 19)によって結局ダメでした。

D: 言えることが何もありません。提出して、Pretestに通って、ハックされただけでした。

ox-x-,1005位/1683人,488点,レートは1578->1501でした。辛うじて青にとどまれました…。

2011/11/04

Codeforces Beta Round #92(Div.2) 参戦記

久しぶりのCodeforces参戦記です。

まずはじめに、Aを解くことにしました。勘違いしてしまい、1WA。再提出して、00:08,Pretest Passed(-> System test Passed).

次にBを読みましたが、どうにもアルゴリズムが思いつきません。仕方がないのでCに移ります。しかし、Cもよく意味がわからない。そこで、Cと同じ配点だからとDに移りました。Dはよく意味がわかったので、方眼紙を出してきて考えました。正領域・負領域の問題であるように思ったので、上手く考えると実装は比較的楽でした。01:08にPretest Passed(-> System test Passed).

Eは解けそうになかったので、Cに戻って咀嚼します。理解したので、実際に組んでみるとなかなかうまくいきました。01:35にPretest Passed(-> System test Passed).

o-oo-,Score:3130,順位:26/1458,レーティングは1550->1666で、紫になりました。問題はこちらです。

2011/09/27

Only Source(ソースだけ)

This article is Only Source! I'm too busy now, so I can't write report.
本記事はソースのみです。忙しくて、レポートを書いている暇がないのでご了承ください。

There are sources which I made at the next contest.
次のコンテストで作成したソースです。

・Codechef September Long/Short
・Codeforces #87 (Div.2) / #88
・Topcoder SRM 518(Div.2)
・UVa The Seventh Hunan Collegiate Programming Contest Semilive
・UAPC 7th

2011/09/09

Codeforces Beta Round #83 & #86 (Div.2) 参戦記

まだ書いていなかったので、#83と合わせてお送りします。

<Codeforces Beta Round #83 (Div.2)>
疲れていまして、1問しか解けませんでした。
Aを00:04に提出して、それっきりです。

B: もしも最大値が他の値の2倍より小さければYESと出せばいいのでは?と思いましたが、間違っていたようで、System testで落とされました。

その後、あまりに眠かったので、寝てしまいました。
得点は492, 順位は465/1179でした。

<Codeforces Beta Round #86 (Div.2)>
スランプに陥っているような気がしてなりません。

A:一読しただけではわからなかったのですが、再読して平方数の判定だけだと分からいました。00:04に提出して、これだけが正解でした。

B: 試してみて、提出まで漕ぎ着けた後、自分の勘違いに気が付きました。面倒だったので諦めました。どう勘違いしたか知りたい方はソースを見てみてください。

C:解いたのですが、
"A sentence is either exactly one valid language word or exactly one statement.".
を見逃していました。コンテストの後、これを確認して再度解いてACを得ました。

E: フェルマーの4N+1定理と思ったのですが、私のソースではシンプルすぎてTLEでした。区間篩など使う必要があるのではないでしょうか。時間があれば試してみたいところです。

得点は492,順位は377/1337, レーティングは1418->1452でした。
少々難しいコンテストだったのでしょうか?


2011/09/04

Codeforces Beta Round #85(Div.2) 参戦記


問題文が短く、大変良いコンテストであったと思います。また、今回、全ての問題を提出するという初の経験をさせてもらいました。結局ケアレスミスで2問しか正解できなかったのですが…。

A: strcmpでOKな問題です。0:07にAccepted.

B: ちょっと考えれば単純な条件がでます。0:17にAccepted.

C: 0:39に提出しましたが、そこでは y<nである可能性を見逃していました。ハックされ、気づくことなく、終わってから他の人のソースを見て気づきました。アルゴリズムは正しいようです。

D: 0:56に提出しましたが、intにしておけばいいものをshortにしていたためシステムテストで落ちました。勿論、intにすれば通りましたから、アルゴリズムは間違いなかったようです。

E:提出はしたものの、正しくはありません。

問題はこちら.
結果は:1418,442位/1273人. Rateは1419->1418.
CやDのアルゴリズムが知りたいなら、ソースを読んでください。

次の記事では、忘れていたCodeforces #83の参戦記を書きます。

2011/08/21

Codeforces Beta Round #82(Div.2) 参戦記

成績は少々悪かったですが、楽しめました。

友人とお茶を飲んだりしていたので、15分ほど遅れた開始しました。
Aのプログラムを組み、2回目の提出で通りました。時間は0:27。

Bはそれほど難しくないと感じましたが、つまらないミスをしていて難度も提出をし直すハメになりました。4回目の提出でようやく通って、0:48です。

Cを読みましたが、DPの練習不足を痛感しているので避けました。D,Eも読み、Eを解くことにします。

最初、Eは最小二乗法などの考えに似ているのかと思いましたが、全くそんなことはないということ気づきました。それが1:30頃のことです。別の方法を考えましたが、時既に遅しでした。

今考えると、Eは滑降シンプレックス法で解けたのではないかと思います。

問題はこちら.
1104点、順位は541/1340で、レートは1504から1451になりました。
もっと練習しなければなりません。

2011/08/14

Codeforces Beta Round #81 参戦記


大変悪い成績でした!

まず、Aを読んで解き始めました。一応組めたと思ってテストをしたのが0:20です。
ここで、辞書式にというのを見逃していたことに気づき、これを実装して提出したのが35分でした。ですが、残念なことに、丸め誤差のため、システムテストで落ちてしまいました。

他の問題は、次の理由で諦めました。
1. 難しい。
2. 問題文が長い。英語が苦手なのでこれはかなりしんどい。

もちろん、久々に0点で、ランクは403/1500でした。問題はこちら
誰ひとりとして全問正解がおらず、1100人近い人が一問も正解しないというのは、少々厳しすぎるラウンドだったのではないでしょうか。

2011/08/08

Codeforces Beta Round #80(Div.2) 参戦記

4問提出して、2問しか正答できない、悪い成績の回でした。幸い、まだ青いままです。

A: switch文を用いて答えを列挙しました。というのは、せいぜい25種類しか入力がないからです。提出して、Pretest Passedが0:05でした。

B: コンテストの前に仕事があって疲れていたので、問題に集中できませんでした。おかげで、理解するのに時間がかかってしまいましたが、計算方法を考えて、0:25にsubmit/pretest passed。

E: 単に数列の部分和を計算するだけの問題で、高速化のしようがないのでは?と思ってしまいました。良いアルゴリズムは得られず、TLEでした(1:20)。

D: 問題文の意味がわからなかったので、入出力例から推測して作ってみたところ、なんとPretest Passed!(1:54) もちろん、Wrong Answerでしたが。 

結果、1398,310位/1093人でした。問題はこちら

今回はDiv.1 A=Div.2 B,1B=2C,1C=2D,1D=2Eと、少し難しかったように感じます。

2011/08/04

Codeforces Beta Round #79(Div.2) 参戦記

少し悔しいRoundでした。

開始後、Aを理解するのに時間がかかります。何度か読み間違えたのですが、0:24にPretest Passed。

BとCはただコードを打つだけの問題でした。Bは0:39、Cは0:57にPretest Passed.

Eも解くことができました。1:33にPretest Passedです。ただし、この解答自体はオーバーフローを起こしてしまいました。下のソースは、64bit整数を使ったものです。

Eのアルゴリズムは次のようになります。
ベクトルA,B,Cを複素数とみなします。この時、与えられた操作によって出来るベクトルは
i(i(i(i…(i(A+n1C)+n2C)+n3C)+…)+nkC
となります。これを展開して、i^2=-1に注意すると
(i^m)A+NC+iN'C
となります。(m=0,1,2,3)
これがBと等しいので、
B-(i^m)A=CN+iCN'
となります。これを解いて、N,N'を求め、それが整数ならばYES、そうでなければNOです。

結果:2404,216/1015でした。少し易し目のラウンドだったようです。

2011/07/30

Codeforces Unknown Language Round #3 参戦記

この大会は、Codeforcesの特別な大会であり、100大会記念の大会でもあります。100大会おめでとう!

[ルール]
この大会では、運営者側が直前に発表するマイナーな言語一つしか使うことができません。今回はPike7.8という言語でした。この言語、TIOBEの100位にも入っていないマイナー言語です。

[参戦記]
スタートして、まずはコンパイラを導入しました。私はUbuntu11.04を使っていますが、次のコマンドでインストールできます。

sudo apt-get install pike7.8

そして、何はともあれチュートリアルを読みました。(こちらです。(英語)). 
この大会、後ろに用事があって3時間中2時間しか参加できないので、2問解ければいいや、という気持ちで臨みました。

A: read関数とキャストを用います。acceptedは0:43でした。
  • 整数の入力(標準入力からの読み取り)がわからなかったので、readとキャストです。
  • 幸いなことにpikeでは、string型変数をint型変数にキャストすると、Cのatoiと同じ働きをしてくれるようです。

C: 文字列を使います。acceptedは1:54でした。
  • 文字列は、0オフセットで、s[n]のように書けば、第n$文字目を取得できます。ただし、その文字コードを示すintの値になります。
  • したがって、文字コードから'0'を引いてやれば、然るべき値になります。

結果、ペナルティー=177, 順位=155位/805人 でした。 

次のUnknownを楽しみにしています。

2011/07/23

Codeforces Beta Round #78(Div.2) 参戦記

(この記事はあくまで参戦記であり、解説ではありません。趣旨をご理解の上お読みください。)
今回は適度な出来でした。自分の実力ではこれぐらいが妥当かな、という点でした。


A: 誤読1回・単純なコーディングミス1回・タイプミス2回とさんざんミスに泣かされた問題でした。23分に254点という酷い出来。

B: 一方でこちらは一発で通り、36分で856点。最初にこっちをやっておけばよかったのですが、後の祭り。

C: 63分にPretest Passedでしたが、ハックされてしまいました。自分の数学的考察に地震がなかったので、調べてみて、ここにたどりつきました。これを使って解いて、107分に808点。ですが、システムテストで引っかかってしまいました。書き間違いでした。残念です。

DとEも読みましたが、私には少々難しすぎました。ただ、Dは面白そうなので、Editrialを読んでみたいとも思いました。

結局,、1110点で、323位/1219人でした。私の出来ならこれぐらいで及第、というところでしょうか。もっと練習をしようという気になる出来でした。

2011/07/09

Codeforces Beta Round #77(Div.2) 参戦記

直前までリコーダーアンサンブルコンサートがあり、それに出演した後、食事を経ての戦い。参加しないほうが良いかもしれないと思っていました。そんな中で参加して、当然結果はあまり良く有りませんでした。

開始して問題を開きますが、なかなかつながらず、この段階でやる気をなくしましたが、とりあえず3分ほどするとみえたのでProblem A。8分にPretest Passed.以前よりはマシになったか。

ですが、次のProblem Bで泥沼にはまり、全く解けなくなってしまいます。他の問題を見ても題意がわからないか、すぐに組めそうにないものばかり。仕方がないので再度Problem Bを叩きます。1時間50分でようやくPretest Passed.これで今回は終わりです。

487/1121,486点でした。問題はこちら

2011/07/02

Codeforces Beta Round #76(Div.2) 参戦記

大変良い出来でした。今までで最高の出来でした。

開始した後、10分でProblem Aをaccepted。非常に単純な問題でした。

Bにとりかかります。19,21分にwrong answer。問題の解釈違いに気づいて直して22分でacceptedです。

Problem C。フォルダの選択方法に関する問題です。普段遊んでいる内容だったので、楽しく組みましたが、2度wrong answer。一つミスをしていることに気づき、直して42分にaccepted.

Problem Dが解けたのが、今回の幸運でした。問題を読んだ時、貪欲法であるように思い、迷いながらも組んでみました。すると、驚いたことに1回でaccepted(1:18)。ここでEに移りますが、解けずに終わりました。

問題はこちら。3816点、8位/1070人と好成績でした。うれしくてお祝いしてしまったぐらいです。また、青にランクアップしました。