<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://purl.org/rss/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">

  <channel rdf:about="https://ice.cos-mania.net/RSS/100/">
    <title>競プロ日記</title>
    <link>https://ice.cos-mania.net/</link>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="https://ice.cos-mania.net/RSS/" />
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />
    <description>競技プログラミングの問題を解いた感想を書きます。</description>
    <dc:language>ja</dc:language>
    <dc:date>2020-01-10T23:28:29+09:00</dc:date>
    <items>
    <rdf:Seq>
      <rdf:li rdf:resource="https://ice.cos-mania.net/%E3%81%9D%E3%81%AE%E4%BB%96/top" />
      <rdf:li rdf:resource="https://ice.cos-mania.net/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3/abc150" />
      <rdf:li rdf:resource="https://ice.cos-mania.net/%E3%81%9D%E3%81%AE%E4%BB%96/2019%E5%B9%B4%E2%86%922020%E5%B9%B4" />
      <rdf:li rdf:resource="https://ice.cos-mania.net/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3/abc149" />
      <rdf:li rdf:resource="https://ice.cos-mania.net/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3/agc041" />
      <rdf:li rdf:resource="https://ice.cos-mania.net/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3/abc148%20%E5%8F%82%E5%8A%A0" />
      <rdf:li rdf:resource="https://ice.cos-mania.net/%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C/abc147%20f%20sum%20difference" />
      <rdf:li rdf:resource="https://ice.cos-mania.net/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E9%96%A2%E9%80%A3/pair%E3%82%92%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E5%8C%96%E3%81%97%E3%81%A6unordered_map%E7%AD%89%E3%81%AB%E5%85%A5%E3%82%8C%E3%82%8B" />
      <rdf:li rdf:resource="https://ice.cos-mania.net/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E9%96%A2%E9%80%A3/%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%AB%E3%82%88%E3%82%8B%E9%85%8D%E5%88%97%E3%81%AE%E6%9C%80%E5%A4%A7%E8%A6%81%E7%B4%A0%E6%95%B0%E3%81%AE%E5%88%B6%E9%99%90" />
      <rdf:li rdf:resource="https://ice.cos-mania.net/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3/abc147%E3%80%80%E5%8F%82%E5%8A%A0" />
    </rdf:Seq>
    </items>
  </channel>

  <item rdf:about="https://ice.cos-mania.net/%E3%81%9D%E3%81%AE%E4%BB%96/top">
    <link>https://ice.cos-mania.net/%E3%81%9D%E3%81%AE%E4%BB%96/top</link>
    <title>TOP</title>
    <description>主にAtCoderで解いた問題の感想とか詰まったところとかを記録します。
自分に対する解説的な一面はありますが、解説ブログを書いているつもりは一切ありません。

AtCoder マイページ
2019/12　現在緑

シンタックスハイライトが働かなくなってしまったので、適当な無料レンタルサーバー借りて...</description>
    <content:encoded><![CDATA[主にAtCoderで解いた問題の感想とか詰まったところとかを記録します。<br />
自分に対する解説的な一面はありますが、解説ブログを書いているつもりは一切ありません。<br />
<br />
<a href="https://atcoder.jp/users/icia" title="" target="_blank">AtCoder マイページ</a><br />
2019/12　現在緑<br />
<br />
シンタックスハイライトが働かなくなってしまったので、適当な無料レンタルサーバー借りてWordPressに移行予定。]]></content:encoded>
    <dc:subject>その他</dc:subject>
    <dc:date>2030-11-01T00:00:00+09:00</dc:date>
    <dc:creator>chlo</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>chlo</dc:rights>
  </item>
  <item rdf:about="https://ice.cos-mania.net/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3/abc150">
    <link>https://ice.cos-mania.net/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3/abc150</link>
    <title>ABC150</title>
    <description>問題

unrated

3完
新年初競プロ&amp;amp;amp;新年初C++。
コンテスト前にABCのC問題までくらい1つ解いておこうと思ったが映画見てご飯食べてたら時間なくなった。

そして2連続unrated。
unratedに気づいた後色々あってやる気を失った。
unratedじゃなかったらたぶん4完。...</description>
    <content:encoded><![CDATA[<a href="https://atcoder.jp/contests/abc150" title="" target="_blank">問題</a><br />
<br />
unrated<br />
<br />
3完<br />
新年初競プロ&amp;新年初C++。<br />
コンテスト前にABCのC問題までくらい1つ解いておこうと思ったが映画見てご飯食べてたら時間なくなった。<br />
<br />
そして2連続unrated。<br />
unratedに気づいた後色々あってやる気を失った。<br />
unratedじゃなかったらたぶん4完。<br />
<br />
色々書いたけどなんか記事消えたので適当。<br />
保存する押して保存しましたのダイアログと共に消えるの頭おかしいだろ。<br />
忍者ブログ本当に嫌。<br />
<br />

<h3>A問題</h3>
<div>かんたん。<br />
チェック段階でkとxを2回間違えてチェックした。<br />
焦りすぎ。<br />
<br />
</div>
<h3>B問題</h3>
<div>もしかしてcount関数ってStringに特殊化されて文字列も数えられる？？？と淡い期待を抱いて実行したら普通にコンパイルエラー。<br />
素直にループ回した。<br />
<br />
</div>
<h3>C問題</h3>
<div>考察実装5分next_permutationの使い方調べるの5分。<br />
なんとなくnext_permutationは順列を扱えるくらいしか知らなかったが、知ってるのは強いね。<br />
初めて使ってみて勉強になった。<br />
<br />
</div>
<h3>D問題</h3>
<div>unratedの根源。<br />
わざわざ問題文にa[i]は偶数と書いてあったのに奇数が紛れていたらしい。<br />
<br />
「最小公倍数は整数をかける場合の最も小さい公倍数なので、整数+0.5をかける場合の最小の半公倍数は最小公倍数の半分。半公倍数の間隔は最小公倍数。」<br />
という考察をコンテスト中にしたが、半分間違っていた。<br />
「最小公倍数は整数をかける場合の最も小さい公倍数なので、整数+0.5をかける場合の最小の半公倍数になる可能性があるのは最小公倍数の半分。半公倍数が存在するなら間隔は最小公倍数。」<br />
というのが正しい。<br />
<br />
というのも、最小の公倍数をZとおくと、Z / a[i]が偶数になるa[i]が存在した場合、最小の半公倍数となる(Z / 2) / a[i]が整数となってしまい、X = a[i] * (p + 0.5)を満たせない。<br />
間隔となる最小公倍数のn倍を足しても必ず満たさないので、半公倍数は存在しないことになる。<br />
<br />
ということで、基本的には(Z / 2) + nZ {n:0以上の整数}が半公倍数の数で、答えとなるM以下のものの数は簡単に計算できるが、Z / a[i]が偶数となるa[i]が1つでも存在したら半公倍数は存在しない。<br />
<br />
コンテスト中はTLE+WAで、色々改善してTLEはなくしたが、後半15個のWAがなくならなかった。<br />
途中で間違えてEに提出してしまったり、そもそもunratedだったりと、WAは入力ミスが原因だろうと1時間くらいで解くのをやめた。<br />
しかしコンテスト終了後に提出してもWAだった。<br />
改めて考察し直してみると、Twitterで偶奇が云々という記述をいくつか見ていたのもあり、最後の偶奇のチェックが必要だとすぐに気付けた。<br />
unratedで解くのをやめていなければ自力で気付けたと思うが、ちょっと時間かかってたかも。<br />
それでも十分時間内に間に合ったとは思うが。<br />
<br />
</div>
<h3>E問題</h3>
<div>
<div>やる気はなかったが方針だけは途中まで立てた。<br />
解説を見る限り基本的には合ってそう。<br />
たぶんその先は時間内に思いつけない。<br />
<br />
&Sigma;a[i] * b[j]を最小化するタイプの問題なので、昇順ソートと降順ソート同士でかけ合わせれば良い。<br />
S[i]が異なっていると置くと、残りN-1個の選び方2^(N-1)の中でC[i]が何番目に大きいかが分かれば良い。<br />
<br />
というのをぼーっと考えていたが、進まなかった。<br />
部分問題まで辿り着けたのは成長だが、そろそろ先に進まないといけない頃合い。<br />
後でしっかり解説読んで理解しよう。<br />
<br />
</div>
<h3>F問題</h3>
</div>
<div>やる気ない中でXORの文字を見つけたので読むのをやめた。<br />
<br />
</div>
<div>
<h3>まとめ</h3>
1年がunratedで終わりunratedで始まるのはどうなんだAtCoder。<br />
別に文句を言いたい気持ちは全然なくて、イメージ悪くない？大丈夫？という感じ。<br />
<br />
明日明後日と3日連続でrated(予定)のコンテストがあるので参加したいのだが、いまいちモチベーションが上がらない。<br />
ブログの移行が進んでいないのが大きい。<br />
詰まった部分は大体解決していて、単純にやっていないからなので頑張ろう。<br />
<br />
保存しましたで消えるの本当に頭おかしいから早く移行したい。<br />
・・・本当に頑張ろう。</div>]]></content:encoded>
    <dc:subject>コンテスト参加感想</dc:subject>
    <dc:date>2020-01-11T01:12:30+09:00</dc:date>
    <dc:creator>chlo</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>chlo</dc:rights>
  </item>
  <item rdf:about="https://ice.cos-mania.net/%E3%81%9D%E3%81%AE%E4%BB%96/2019%E5%B9%B4%E2%86%922020%E5%B9%B4">
    <link>https://ice.cos-mania.net/%E3%81%9D%E3%81%AE%E4%BB%96/2019%E5%B9%B4%E2%86%922020%E5%B9%B4</link>
    <title>2019年→2020年</title>
    <description>あけましておめでとうございます。

年明けてから年末のコンテスト参加記事をいくつか書いたけど改めて。
とりあえずAtCoderの記録を乗せる。
去年はyukicoderも張ったが、今年はAtCoderがメインで、AOJとyukicoderはライブラリの確認とかでしか解いていないのでAtCoderだけ...</description>
    <content:encoded><![CDATA[あけましておめでとうございます。<br />
<br />
年明けてから年末のコンテスト参加記事をいくつか書いたけど改めて。<br />
とりあえずAtCoderの記録を乗せる。<br />
去年はyukicoderも張ったが、今年はAtCoderがメインで、AOJとyukicoderはライブラリの確認とかでしか解いていないのでAtCoderだけ。<br />
<br />
～2020/1/10<br />
<a target="_blank" href="//ice.cos-mania.net/File/1aa3565e.png" title=""><img src="//ice.cos-mania.net/Img/1578606620/" alt="" /></a> <br />
<br />
<br />
やってる時期とやってない時期が激しすぎる。<br />
2週間に1日だけとかが何回かあるのがあんまりやってないなーって感じする。<br />
趣味は他にもいくつかあるからずっとやるのは難しいが、もうちょっと継続的にやりたいね。<br />
<br />
<br />
今年の目標は黄か橙。<br />
青は(やれば)いけると思うので、その先が大事。<br />
<br />
この記事はまた更新するかも。<br />
<br />
]]></content:encoded>
    <dc:subject>その他</dc:subject>
    <dc:date>2020-01-10T06:56:13+09:00</dc:date>
    <dc:creator>chlo</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>chlo</dc:rights>
  </item>
  <item rdf:about="https://ice.cos-mania.net/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3/abc149">
    <link>https://ice.cos-mania.net/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3/abc149</link>
    <title>ABC149</title>
    <description>問題

unrated

4完
初めて参加したコンテストがunratedになった。
出来はひどかったので助かった。


A問題
かんたん。


B問題
問題文読み間違えた。
問題文のGreedy Takahashiからして、高橋くんは自分も青木くんもクッキーを持ってる場合、青木くんのクッキーから食べ...</description>
    <content:encoded><![CDATA[<a href="https://atcoder.jp/contests/abc149" title="" target="_blank">問題</a><br />
<br />
unrated<br />
<br />
4完<br />
初めて参加したコンテストがunratedになった。<br />
出来はひどかったので助かった。<br />
<br />

<h3>A問題</h3>
<div>かんたん。<br />
<br />
</div>
<h3>B問題</h3>
<div>問題文読み間違えた。<br />
問題文のGreedy Takahashiからして、高橋くんは自分も青木くんもクッキーを持ってる場合、青木くんのクッキーから食べにかかると思って実装してしまった。<br />
普段BくらいまではACを見ずに次の問題に取り掛かるのだが、今回はCを提出した後に20/20の表示でまだジャッジ中だった。<br />
遅くない？？？と思いつつもDに取り掛かり、途中でBがWAしてるのを確認。<br />
問題の読み間違いに気づき、再度提出してDに取り掛かる。<br />
しかしBだからと高をくくって詰めが甘くてまたWA。<br />
今度はDを解いた後に気づいた。<br />
最終的にACDBという珍しいAC順になった。<br />
毎回毎回あほらしいミスを繰り返しているが、簡単なBで何度もやらかしてしまったのは反省点高い。<br />
<br />
</div>
<h3>C問題</h3>
<div>かんたん。<br />
エラトステネスの篩張ったら終わった。<br />
<br />
</div>
<h3>D問題</h3>
<div>最近のDにしては複雑な問題だなーという感想。<br />
K個前の値を保存してDPすれば良さそう・・・と思ったのだが、どう頑張ってもK個前の値だけじゃ遷移を進められない。<br />
「K個前の値」じゃなくて「K個前までの全ての値」を保存しないといけないという考えから抜け出せなかった。<br />
あるところでK個毎に独立してるのでは？と気付き、modKで分けてDPの方針が立った。<br />
この時点で結構時間が立っており、これ以上ミスを重ねたくないとかなり安定志向の実装にしたつもりだが、modK毎のインデックスがすんなりいかずデバッグにかなり時間を取られた。<br />
<br />
最初は出す手を数字と連想配列でうまく関連付けてシンプルな条件式にしようとしていたのだが、安定志向で条件式が長くなってしまった。<br />
今回はミスしなかったが、長いとミスも増えるしどっちが良いのか悩みどころ。<br />
うまく関連付ける内容は、詳しい部分は忘れてしまった。<br />
もう去年の話だぞ。<br />
記事書いてるのは徹夜明けの早朝6時過ぎだぞ。<br />
<br />
最終的にACしたのが73分。<br />
時間かかりすぎ。<br />
<br />
聞くところによるとDPなんかしなくても貪欲で良いらしい。<br />
ちょっと考えてみればすぐわかる話だ。<br />
とりあえず勝てるなら勝てる手を出せば、他の順番と比べて同じ点数になることはあっても悪くなることはない。<br />
最善が複数ある場合に貪欲で解けるっていうの慣れないとなと感じた。<br />
これゲーム問題の分野かな。<br />
ゲーム問題も解かないとなぁ。<br />
<br />
</div>
<h3>E問題</h3>
<div>
<div>去年の話なのでもうあまり覚えていない。</div>
<div>去年の話とかいう便利な言葉。</div>
<div>とりあえず覚えているのが、AGC 020 Cを思い出したこと。<br />
解いていないのだが、解説をちらっと読んだ覚えがあった。<br />
全ての組み合わせの中から、大きい方からM個を考える時、必ず満たす性質がないかというのをずっと考えていた。<br />
しかしうまくいかずにタイムアップ。<br />
<br />
解説PDFをちらっと見て理解した解法が、ある値を決め打つ二分探索を基本として、その二分探索の途中でさらに二分探索をする方法。<br />
2回目の二分探索がPDFで言う「左手で握手する人を先に決めたとき、右手で握手できる人が何人いるかは累積和を用いることでO(1)で求まる」という部分で、最初この部分が理解できなかったので、方針だけ理解して二重に二分探索すればできそうだなと考えた。<br />
制約的にはO(Nlog^2N)でも間に合いそうだが、部分問題として考えるとO(logN)からO(1)は結構大きいので、この累積和の部分を頑張って考えた。<br />
理解はできたのだが、PDFはもうちょっと詳しく書いてほしいなー。<br />
<br />
累積和といえば累積和だが、「V[i] = 数列中のi以上の数」と見れば良いだけで、インデックスとして考えるのではなくて値として考えるというちょっと変わった累積和だ。<br />
だから数列中の値の最大値も重要になってくる。<br />
<br />
こういう添字に意味を持たせるタイプの問題ずっと苦手だなぁ。<br />
記事に書いた記憶があるが、BITの添字に意味を持たせるタイプの問題で、「こういうデータの持ち方するという発想に至るのきついなぁ。考えられるようになれるかなぁ。」といったことを書いた記憶があるのだが、やはりきつい。<br />
次はこういう発想も道具として取り出せるようにしておきたい。<br />
<br />
</div>
<h3>F問題</h3>
</div>
<div>なんかむずかしそー。<br />
完。<br />
まぁunratedだし？という気持ちが溢れてた。<br />
<br />
</div>
<div>
<h3>まとめ</h3>
2019年最後がunrated！<br />
まぁ助かった。<br />
<br />
このコンテストは自分の苦手ポイントを自覚させてくれて得られるものが大きかったように思う。<br />
ミスをするなというのは言わずもがな。<br />
・modKで考える発想。<br />
・必ずしも最善は一択ではなく、そのうちの1つが分かれば良いという発想。<br />
・累積和やBIT等、配列的なデータ構造のインデックスに意味を持たせる発想。<br />
この3つが足りないと感じた。<br />
modKは最近の問題でも理解に時間がかかったばかりだ。<br />
値を決め撃って二分探索する発想はかなり浮かぶようになってきたので、この感覚を参考にこれらの発想も定着させていきたいね。<br />
<br />
今日は2020年初のコンテスト。<br />
参加するなら新年初C++コーディングになる。<br />
年末年始全くやっていないので心配だなー。</div>]]></content:encoded>
    <dc:subject>コンテスト参加感想</dc:subject>
    <dc:date>2020-01-10T06:22:57+09:00</dc:date>
    <dc:creator>chlo</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>chlo</dc:rights>
  </item>
  <item rdf:about="https://ice.cos-mania.net/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3/agc041">
    <link>https://ice.cos-mania.net/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3/agc041</link>
    <title>AGC041</title>
    <description>あけましておめでとうございます。
新年初記事。
年末に記事を書きたかったけど時間がなかったのでまずは2日連続のコンテスト参加記事から。

問題

順位: 1193
パフォーマンス: 1256
新レーティング: 1075
差分: -27


1完。
初めてAGCに参加したが、さすがに難しかった。
目覚...</description>
    <content:encoded><![CDATA[<div>あけましておめでとうございます。<br />
新年初記事。<br />
年末に記事を書きたかったけど時間がなかったのでまずは2日連続のコンテスト参加記事から。<br />
<br />
問題<br />
</div>
<div>順位: 1193</div>
<div>パフォーマンス: 1256</div>
<div>新レーティング: 1075</div>
<div>差分: -27</div>
<div><br />
<br />
1完。<br />
初めてAGCに参加したが、さすがに難しかった。<br />
目覚めたらコンテスト開始してて、なんとか頑張って9:10過ぎから活動開始した。<br />
結果論だが、Aは一瞬で解けて終わりなので最初から参加していればもっとパフォーマンス出てそう。<br />
寝起きによる自身のパフォーマンスも含めて。<br />
</div>
<h3>A問題</h3>
<div>直近のABC148 Fとすごい似てるなーという第一印象。<br />
偶奇があっていれば2人とも全て勝ち続ければ出会う。<br />
偶奇を合わせるためにはどちらかが同じ場所に留まる必要があり、端でしか留まることができないので、端に近い人が端に行って1回留まれば良さそう。<br />
普通にAC。<br />
考察から実装まで5分ちょっと。<br />
寝坊のせいで20分になってしまった。<br />
</div>
<h3>B問題</h3>
<div>この問題を2時間近く考えて結局解けなかった。<br />
解析的に解け・・・ない。<br />
二分探索でき・・・ない。(！)<br />
二分探索に使うような関数で全問題に対して可能かどうか走査・・・いけそう？<br />
というような流れで、計算量抑えつつなんとか実装できないか色々してたら解けなかった。<br />
二分探索の発想に至るのにおそらく1時間以上かかったのはまだしも、そこからダメの判断を下したのは非常にbad。<br />
単調増加であるという判断ができなかった。<br />
PやVの値によって場合分けしていたのだが、場合分けしていることが問題を必要以上に複雑にしてしまった。<br />
<br />
よく考えてみると、ある問題Xが可能であるとすると、問題Xよりスコアが大きい問題Yと問題Xの選び方を入れ替えると、Yを選ぶことが可能となる。<br />
ただそれだけなのに、何点入れればある問題を選ぶことが可能で、残りの点数はどのように振り分ければ他の問題がある点数以内に収まるか、ある点数以内に収まるようにすると点数が余る場合はどのようにすれば良いか。<br />
こんなことを考えていた。<br />
ある問題を選ぶことが可能であるかどうか知りたいだけなので、M人全員が1点ずつ選ぶとして良い。<br />
それに気付けなかったのが敗因。<br />
<br />
</div>
<h3>C問題</h3>
<div>ややこC。<br />
問題文とドミノの配置を理解するのに相当時間がかかった。<br />
偶数(偶数は色々便利そうと考えた)で一番小さい4&times;4について手作業で考えてみようと思ったが、それすらちょっと考えただけでは分からなかったので、その先は無理だろうということでBに専念。<br />
ただ実際には、苦労してでも4&times;4を実装することが本筋だった。<br />
マス目が小さい値でクオリティが同じものを構成すれば、後はそれらを組み合わせて対角線上に配置すれば、全ての行列でクオリティを保ったままになる・・・なるほど。<br />
2の場合は不可能、3の場合はクオリティ1を作成でき、4, 5, 6, 7の場合はクオリティ1は作成できないが、クオリティ3のものを作成でき、4, 5, 6, 7があれば8以上は全て作成できるのでこれで考える必要のある構成は全て。<br />
<br />
相当パズル要素強い。<br />
競プロの大部分を占めるであろう数学系とかシミュレーション系しか解いたことがないので、こういった問題は面白いと感じるが、さすがに引き出しがなさすぎるからその方向に考えを移行できない。<br />
もっと余裕持って問題解きたいね</div>
<div></div>
<h3>D問題以降</h3>
<div>見てまーーーーーせん。<br />
ABCなら解けなくてもコンテスト終了後に解説見て云々あるのだが、解説すら見ていない。<br />
ちょっとレベルが違いそうで解くのはいつになるやら。<br />
<br />
</div>
<div>
<h3>まとめ</h3>
初めてのAGCだが、一応レートは上がったので変な苦手意識を持たずに済んだ。<br />
B問題はdiff水色だし解けても良かったなー。<br />
<br />
また原因を寝坊に求めることもできるが、そもそも最近まともに頭働いていない状態からコンテストに参加することが多くて反省している。<br />
起きてから本稼働開始までに3,4時間かかる人間なので、本来ならもっと早く起きておくべきなのだが、年末だしねということでひとつ。<br />
<br />
年内目標だったブログの移行はまだ少しかかりそう。<br />
水色もブログの移行も年内無理だったかぁ。</div>]]></content:encoded>
    <dc:subject>コンテスト参加感想</dc:subject>
    <dc:date>2020-01-02T15:45:33+09:00</dc:date>
    <dc:creator>chlo</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>chlo</dc:rights>
  </item>
  <item rdf:about="https://ice.cos-mania.net/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3/abc148%20%E5%8F%82%E5%8A%A0">
    <link>https://ice.cos-mania.net/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3/abc148%20%E5%8F%82%E5%8A%A0</link>
    <title>ABC148 参加</title>
    <description>問題

順位: 1671
パフォーマンス: 1053
新レーティング: 1048
差分: -2


5完
5完なのにレート下がるなんてそんな・・・。
全体的に簡単が過ぎる・・・。
E問題もうちょっと早く解けても良かったのと、F問題の考察進める速度が遅すぎた。
生活習慣ゴミだったので、ほぼ徹夜明け+テ...</description>
    <content:encoded><![CDATA[<h3><a href="https://atcoder.jp/contests/abc148" title="" target="_blank">問題</a></h3>
<div><br />
順位: 1671</div>
<div>パフォーマンス: 1053</div>
<div>新レーティング: 1048</div>
<div>差分: -2<br />
<br />
</div>
<div>5完<br />
5完なのにレート下がるなんてそんな・・・。<br />
全体的に簡単が過ぎる・・・。<br />
E問題もうちょっと早く解けても良かったのと、F問題の考察進める速度が遅すぎた。<br />
生活習慣ゴミだったので、ほぼ徹夜明け+テレビ見ながらと、コンディションはなかなかに悪かったのが言い訳になりそう。<br />
M-1見たかったからね。<br />
<br />
</div>
<h3>A問題</h3>
<div>かんたん。<br />
実装楽にするためにどうしようかちょっと考えた。<br />
ハッシュ化すれば簡単そう、いやハッシュ化できるならそのままでも・・・、という流れで6-A-Bじゃんとなった。<br />
</div>
<h3>B問題</h3>
<div>かんたん。<br />
B問題でこんなに簡単なの久しぶり？<br />
</div>
<h3>C問題</h3>
<div>かんたん。<br />
C問題でこんなに簡単なの初めて？<br />
前回のbit全探索見習って。<br />
最小公倍数のライブラリ作ってて良かった。<br />
</div>
<h3>D問題</h3>
<div>貪欲でいけそうと比較的すぐ気付いたものの、実装で手間取った。<br />
素直にforの中でif使えば良いものの、<a href="http://ice.cos-mania.net/プログラミング関連/配列内で特定の条件を満たす連続する要素を数える" title="" target="_blank">連続要素数える時</a>と似てるな、ということでwhileなんて使うから1WA+タイムロスを生んでしまった。<br />
15分かかってしまったが、5分で解けても良かった。<br />
</div>
<h3>E問題</h3>
<div>なんだこの数列は・・・。<br />
制約すごいからLogかけられそうということで行列累乗を試してみる。<br />
式は作れたものの、変数が出てきてしまってうまく繰り返し二乗が使える形に持っていけない。<br />
<br />
最初のいくつかをシミュレートして数式辞典で調べてみるとそれ知ってるよーと教えてくれた！<br />
二重階乗というらしい。<br />
なんならn!!とか記号までついてる。<br />
名前も記号も初めて見たんだが？<br />
一般項もあったが、どう頑張っても誤差出ますよーって見た目してる。<br />
それに多倍長でも無理だろって桁になりそう。<br />
<br />
諦めて0が何個続くかに重点を置いて考察していくと、10作るなら2&times;5しかないと気づく。<br />
・・・これどこかでやらなかった？？？<br />
2は山程あるから5だけ数えれば良いってすごいどこかでやった考え方。<br />
どこでやったのか全然思い出せなかったし、今も分かってない。<br />
とりあえず方針は立ったが5の数え方はすぐに出てこなかったので、いくつか書いてみたら5^nごとに1回ずつ出てくるというのが分かった。<br />
<br />
その通り実装するも、ここで恒例の凡ミス。<br />
forの更新式でi*=5で5^nを計算していきたかったのだが、i*=iとしてしまって答えが合わない。<br />
考察25分+凡ミス10分で35分くらいかかった。<br />
</div>
<h3>F問題</h3>
<div>ここまで57分。<br />
時間は余裕というわけではないが、なんか解けそうな雰囲気。解けなかった。<br />
考察が全然進まなかったが、コンテストの時間内では最終的に、「u, v間の最短経路を通って高橋くんが青木くんにギリギリまで近づき(近づいた後の頂点をaとする)、その近づいた際に通ったルートの各点から(各点をbとする)、青木くんのいない方にできるだけ頂点がある道に進み、その頂点数+aとbの距離が逃げられる最長距離。偶奇によって&plusmn;1がありそう。」という考えになった。<br />
考察にかなり時間がかかった上、実装も結構ややこしかったのでタイムアップ。<br />
実装に取り掛かったのは30分後くらいだと思うが、考察も続けながらなので厳しかった。<br />
さすがにまだDFS2回はスラスラ書けないねー。<br />
<br />
方針はあってそうなんだけどなーと思っていたので、コンテスト終了後も自力で解き続けてみた。<br />
実装を進めていくと、近づいた際の各点bからのルートは、近づいた最終の頂点aからのルートに含まれていることに気付いた。<br />
つまり、「u, v間の最短経路を通って高橋くんが青木くんにギリギリまで近づき、近づいた後の頂点から青木くんのいない方にできるだけ頂点がある道に進み、その頂点数が最長距離。偶奇によって&plusmn;1がありそう。」とかなり実装が簡単になった。<br />
順調に実装を進めて提出するとWA。<br />
よく考えると偶奇の処理が正確でなかったので直してAC。<br />
コンテスト終了後の所要時間は15分くらい。<br />
解説見ずにF通せたのは初めてかもしれない。<br />
diff水色だけど。<br />
</div>
<div>
<h3>まとめ</h3>
E問題diff茶色ってマジ？おかしくない？<br />
バッドコンディションが脳死行列累乗に繋がって、それに時間かけたのはかなり悪手だった。<br />
とは言え茶色に時間かかるのは苦手問題ってことなのかなぁ。<br />
それよりは単純にFの考察をもっと短く正確にというのが本筋か。<br />
<br />
-2とは言えレート下がってしまったので、年内水色難しそう。<br />
しかもブログの移行関連で面白そうなものを見つけてしまい、そればかりで全く問題を説いていない。<br />
今日はAGC明日はABCと一応出るが、今日の初AGCがどうなるかで決まる感じがある。<br />
AGCは過去問すら1問も解いていないので不安しかない。<br />
なんとか頑張っていきたいところ。<br />
<br />
ブログのシンタックスハイライトは直ったみたい。<br />
やっぱり悪いのは忍者ブログだった！<br />
直ったからブログの移行はまぁいいやとしても良いのだが、前述の通り面白そうなのを見つけて結構時間をかけているから移行はする。<br />
色々考えた結果デザインが1から自分でになったのがつらすぎる。<br />
こっちも年内目標。</div>]]></content:encoded>
    <dc:subject>コンテスト参加感想</dc:subject>
    <dc:date>2019-12-28T13:06:10+09:00</dc:date>
    <dc:creator>chlo</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>chlo</dc:rights>
  </item>
  <item rdf:about="https://ice.cos-mania.net/%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C/abc147%20f%20sum%20difference">
    <link>https://ice.cos-mania.net/%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C/abc147%20f%20sum%20difference</link>
    <title>ABC147 F Sum Difference</title>
    <description>問題
ACコード
ACコード(区間をsetで管理)　2019/12/17追記

通常

#include &amp;amp;lt;bits/stdc++.h&amp;amp;gt;
#define GET_REP(_1, _2, _3, NAME, ...) NAME
#define rep(...) GET_REP(__VA_A...</description>
    <content:encoded><![CDATA[<div><a href="https://atcoder.jp/contests/abc147/tasks/abc147_f" title="" target="_blank">問題</a></div>
<div><a href="https://atcoder.jp/contests/abc147/submissions/8939462" title="" target="_blank">ACコード</a><br />
<a href="https://atcoder.jp/contests/abc147/submissions/8987244" title="" target="_blank">ACコード(区間をsetで管理)</a>　2019/12/17追記<br />
<br />
通常<br />

<pre class="line-numbers"><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
#define GET_REP(_1, _2, _3, NAME, ...) NAME
#define rep(...) GET_REP(__VA_ARGS__, irep, _rep)(__VA_ARGS__)
#define rep1(...) GET_REP(__VA_ARGS__, irep1, _rep1)(__VA_ARGS__)
#define _rep(i, n) irep (i, 0, n)
#define _rep1(i, n) irep1(i, 1, n)
#define irep(i, a, n) for (int i = a; i &lt; (int)(n); ++i)
#define irep1(i, a, n) for (int i = a; i &lt;= (int)(n); ++i)
#define rrep(i, n) for (int i = (int)(n) - 1; i &gt;= 0; --i)
#define rrep1(i, n) for (int i = (int)(n); i &gt;= 1; --i)
#define allrep(X, x) for (auto &amp;&amp;X : x)
#define all(x) begin(x), end(x)
#define debug(x) cout &lt;&lt; #x " =&gt; " &lt;&lt; (x) &lt;&lt; endl
#ifdef LOCAL
  #include "../../Lib/cout_container.hpp"
#endif
using lint = long long;
constexpr int MOD = (int)1e9 + 7;
constexpr double EPS = 1e-9;
using namespace std;
namespace { struct INIT { INIT() { cin.tie(0); ios::sync_with_stdio(false); cout &lt;&lt; fixed &lt;&lt; setprecision(15); } } INIT; }

int main(void) {
  lint n, x, d;
  cin &gt;&gt; n &gt;&gt; x &gt;&gt; d;
  if (d == 0) {
    if (x == 0) {
      cout &lt;&lt; 1 &lt;&lt; endl;
    } else {
      cout &lt;&lt; n + 1 &lt;&lt; endl;
    }
    return 0;
  }
  // ?
  if (d &lt; 0) {
    x = -x;
    d = -d;
  }
  unordered_map&lt;int, vector&lt;pair&lt;lint, lint&gt;&gt;&gt; now;
  for (lint A = 0; A &lt;= n; ++A) {
    // S = Ax + Bd
    lint Bmin = (A - 1) * A / 2, Bmax = (2 * n - A - 1) * A / 2;
    lint Adiv = A * x / d, Smod = A * x % d;
    if (Smod &lt; 0) {
      Smod += abs(d);
      // ?
      ++Adiv;
    }
    now[Smod].push_back({Adiv + Bmin, Adiv + Bmax});
  }
  lint cnt = 0;
  allrep (m, now) {
    sort(all(m.second));
    lint now = LLONG_MIN;
    allrep (p, m.second) {
      lint l = max(now, p.first), r = max(now, p.second + 1);
      cnt += r - l;
      now  = r;
    }
  }
  cout &lt;&lt; cnt &lt;&lt; endl;
  return 0;
}
</code></pre>
<br />
区間をsetで管理<br />

<pre class="line-numbers"><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
#define GET_REP(_1, _2, _3, NAME, ...) NAME
#define rep(...) GET_REP(__VA_ARGS__, irep, _rep)(__VA_ARGS__)
#define rep1(...) GET_REP(__VA_ARGS__, irep1, _rep1)(__VA_ARGS__)
#define _rep(i, n) irep (i, 0, n)
#define _rep1(i, n) irep1(i, 1, n)
#define irep(i, a, n) for (int i = a; i &lt; (int)(n); ++i)
#define irep1(i, a, n) for (int i = a; i &lt;= (int)(n); ++i)
#define rrep(i, n) for (int i = (int)(n) - 1; i &gt;= 0; --i)
#define rrep1(i, n) for (int i = (int)(n); i &gt;= 1; --i)
#define allrep(X, x) for (auto &amp;&amp;X : x)
#define all(x) begin(x), end(x)
#define debug(x) cout &lt;&lt; #x " =&gt; " &lt;&lt; (x) &lt;&lt; endl
#ifdef LOCAL
  #include "../../Lib/cout_container.hpp"
#endif
using lint = long long;
constexpr int MOD = (int)1e9 + 7;
constexpr double EPS = 1e-9;
using namespace std;
namespace { struct INIT { INIT() { cin.tie(0); ios::sync_with_stdio(false); cout &lt;&lt; fixed &lt;&lt; setprecision(15); } } INIT; }

template &lt;bool merge_adjacent&gt;
class SectionUnion {
  struct comp { bool operator()(const pair&lt;long long, long long&gt; &amp;a, const pair&lt;long long, long long&gt; &amp;b) const { return a.second &lt; b.second; } };

  public:
  set&lt;pair&lt;long long, long long&gt;, comp&gt; section_set;
  SectionUnion(void) {}
  bool insert(long long l, long long r) {
    auto litr = section_set.lower_bound({0, l - merge_adjacent}), ritr = section_set.lower_bound({0, r});
    if (ritr != section_set.end() &amp;&amp; r + merge_adjacent &gt;= ritr-&gt;first) ++ritr;
    const bool exist = litr != ritr;
    if (exist) {
      l = min(l, litr-&gt;first), r = max(r, prev(ritr)-&gt;second);
      section_set.erase(litr, ritr);
    }
    section_set.insert({l, r});
    return exist;
  }
  bool remove(long long l, long long r, bool involve = false) {
    auto litr = section_set.lower_bound({0, l}), ritr = section_set.lower_bound({0, r});
    if (ritr != section_set.end() &amp;&amp; r &gt;= ritr-&gt;first) ++ritr;
    const bool exist = litr != ritr;
    if (exist) {
      long long ledge = litr-&gt;first, redge = prev(ritr)-&gt;second;
      section_set.erase(litr, ritr);
      if (!involve) {
        if (ledge &lt; l) section_set.insert({ledge, l - 1});
        if (r &lt; redge) section_set.insert({r + 1, redge});
      }
    }
    return exist;
  }
  bool same(long long a, long long b) const {
    if (b &lt; a) swap(a, b);
    auto itr = section_set.lower_bound({0, b});
    return itr != section_set.end() &amp;&amp; itr-&gt;first &lt;= a;
  }
  pair&lt;bool, pair&lt;long long, long long&gt;&gt; get(long long x) const {
    auto itr = section_set.lower_bound({0, x});
    return {!(itr == section_set.end() &amp;&amp; x &lt; itr-&gt;first), *itr};
  }
  void clear(void) { section_set.clear(); }
  bool empty(void) const { return section_set.empty(); }
  int  size(void) const { return section_set.size(); }
};

int main(void) {
  lint n, x, d;
  cin &gt;&gt; n &gt;&gt; x &gt;&gt; d;
  if (d == 0) {
    if (x == 0) {
      cout &lt;&lt; 1 &lt;&lt; endl;
    } else {
      cout &lt;&lt; n + 1 &lt;&lt; endl;
    }
    return 0;
  }
  if (d &lt; 0) {
    x = -x;
    d = -d;
  }
  unordered_map&lt;int, SectionUnion&lt;true&gt;&gt; now;
  for (lint A = 0; A &lt;= n; ++A) {
    // S = Ax + Bd
    lint Bmin = (A - 1) * A / 2, Bmax = (2 * n - A - 1) * A / 2;
    lint Adiv = A * x / d, Smod = A * x % d;
    if (Smod &lt; 0) {
      Smod += abs(d);
      ++Adiv;
    }
    now[Smod].insert(Adiv + Bmin, Adiv + Bmax);
  }
  lint cnt = 0;
  allrep (m, now) {
    allrep (p, m.second.section_set) cnt += p.second - p.first + 1;
  }
  cout &lt;&lt; cnt &lt;&lt; endl;
  return 0;
}
</code></pre>
<br />
練習で解く問題が4問の旧ABCばかりなので最近記事を書くほど詰まる問題がなかった。<br />
久々に骨がある問題を解いた。<br />
AtCoder Problemsでも黄上位くらいになっているし、青はかなり手の届く問題になってきたかな。<br />
<br />
本番では取り組む時間がなかったので、まっさらな状態からスタート。<br />
こういうシンプルな問題は解き慣れていないので何から手をつけて良いのか全く分からなかった。<br />
解説を読んで方針だけなんとか把握できた。<br />
基礎をしっかりしてないと解けない感じで、こういう問題をしっかり練習するのは大事っぽい。<br />
イメージとしては、簡単なE問題レベルが4つか5つくらい重なった感じ。<br />
自分の簡単なE問題の正解率を70~80%とすると、5つ重なったら正解率20%もないんだが！？となる。<br />
<br />

<h3>考察</h3>
まず重要なのが、Tを考えずにSだけを考えれば良いという置き換え。<br />
Sを決めればTも決まるのでなるほど当然だが、しっかり意識しないと両方考えちゃいそう。<br />
両方考えても解けるのだろうが、やっぱり簡単な方が良いね。<br />
実際Sだけ考えれば良いと分かった段階でかなり先が開けた気がする。<br />
<br />
Sについて考えると決めれば、次に行き着くのは選ぶ個数Aを0~Nで固定してループする。<br />
何度も見た解き方なのでこれは問題なく辿り着けるだろうと思う。<br />
次の悩みどころが、個数を固定した上で何通りの選び方があって、他の個数との被りがないか。<br />
これをチェックする必要がある。<br />
<br />
まず、何通りの選び方があるかを考える。<br />
ここで生きるのが、各iにおける値を数式で表現する書き方。<br />
ただ単に等差数列という認識ではなく、「X, X+D, X+2D, ..., X+(N-1)D」と捉えることで、A個を選んだ際の合計がAX+BDという形で表現できる。<br />
Bの最低値Bminは、0から1ずつ増やしたA個の合計なので、(0+A-1)*A/2。<br />
Bの最大値Bmaxは、(N-1)から1ずつ減らしたA個の合計なので、{(N-1)+(N-1-A+1)}*A/2 = (2N-A-1)*A/2。<br />
Dの係数は1刻みなので、Bmin~Bmaxまでの間を1刻みで(Bmax-Bmin+1)個の値を作れる(+1は開区間なので)。</div>
<div>AXについては、ループ内ではAを固定しているためAXの値も同じく固定となる。<br />
このことから、Aを固定すると(Bmax-Bmin+1)個の値を作れることになる。<br />
<br />
このままでは、他のAを選択した場合の値との被りを考慮していない。<br />
これからがおそらくこの問題の本質なのかな。<br />
解説PDFの、modD毎に考えれば良いという記述、雑ぅ・・・。<br />
理解すれば確かにmodD毎に考えれば良いのだが。<br />
modD毎に考えると、複数の区間を結合して、区間の合計を求めるような問題になる。<br />
集合として考えると、まさしく和集合という感じ。<br />
かなり典型チックな雰囲気を醸し出しているが、懇切丁寧に解説しているような記事はなかった。<br />
<br />
modDを理解する部分で大事なのが、AX+BminD~AX+Bmaxを、Bが1刻みになっていると見るのではなく、式全体としてみるとD刻みになっていると捉えること。<br />
つまり、AX+BminD~AX+Bmaxの間でmodDの値は変化せず、その値はAXのみで決まる。<br />
これを式に表すと、AX+BD = (AX/D+B)D+AX%Dとなる(AX/Dは切り捨て)。<br />
この式を見ると、AX%D毎に独立して(AX/D+B)を考えれば被りを防げることが分かるので、(AX/D+B)をBmin~Bmaxの区間を被らないように数える和集合の問題になった。</div>
<div>フレンズのアライグマさんの画像がすっごく分かりやすくて理解をかなり助けてくれた。<br />
<a href="https://twitter.com/kyopro_friends/status/1203677333409812480" title="" target="_blank">アライグマさんの解説</a><br />
<br />
これでほぼ終わりなのだが、ここまで来てこの区間の和集合が難しい。<br />
setで管理すれば簡単だけど計算量的にどうなのって話になる。<br />
問題の設定から、必ず区間は正の方向に被るとか、区間を覆ってしまうような区間は存在しないとか、色々考えたが、そういう細かい部分まで考える必要はなかった。<br />
区間を順に考えるのではなく、一度全ての区間を列挙した後で、区間の最小値(最大値でも良い)でソートする。<br />
そうすれば、問題の設定に関係なく、区間の最小値は必ず逆行することがないという保証が得られる。<br />
後は、現在どこまで区間を選んでいるかを保存しながら走査していけば被りなく区間を数えられる。<br />
やったー解けた！<br />
d=0の場合と、d=0かつx=0の場合は、全然話が変わってくるから注意しよね。<br />
<br />

<h3>実装</h3>
まずmodDに騙された話。<br />
modって巨大な数を扱えないからmod取ったよー＾＾とする場合が多いので、疑いなく二次元配列の要素数としてDの絶対値を取ったのだが、Dの制約が10^8。<br />
<a href="http://ice.cos-mania.net/プログラミング関連/メモリによる配列の最大要素数の制限" title="" target="_blank">僕は学んでいる、二次元配列でその要素数はダメだと。</a><br />
全体でN+1回しかpush_backされないので、vectorを連想配列に入れれば解決。<br />
<br />
modの話はもう1つあって、負の数のmodがなかなか曲者。<br />
C++ではa%b=cとすると、a負ならbに関係なくcは負の数か0になる。たぶん。<br />
正の数にしたかったら、cが負ならbを足せば良いだけなのだが、同時にa/b=dも使う場合は、&plusmn;1しないと(bの正負によって符号が変わる)、b*d+c=aを満たせなくなってしまう。<br />
符号変わるしcが負でも0だと&plusmn;1しなくて良いしで面倒臭い。<br />
これを考慮して、dを正に固定してdにプラス1するような実装にしてみたのだが(?コメントの部分)、この+1の部分がなくてもACしてしまう。</div>
<div>なぜ通るかいまいち分かっていなかったのだが、記事を書きながら気付いた。<br />
Xが負ならAX%Dも全て負の数か0になるので、modDが0以外の場合は全てにおいて-1されている状態であり、何通りかという問題に対しては影響を与えず正しい答えが出ているっぽい。<br />
本当は違うんだけどこれでも良いよみたいなのはなぜ通るのか理解しないとすごくもやもやするので、自分なりに解き明かせてよかった。<br />
<br />
次はそんなに悩んでないが、やっぱり半開区間便利だねの話。<br />
数列Zi(0&lt;=i&lt;N)のうち今Znowまで見ていて、次の区間(Zmin, Zmax)が得られた時に区間の合計を更新しながらZnowを更新してねとなった時、開区間だと結構ややこしい。<br />
Znow=Z0でZ3~Z9が得られた時、区間の合計に+(9-3)+1する。<br />
しかし、Znow=Z5でZ3~Z9が得られた時は、区間の合計に+(9-5)となり、Z5は既に合計に入っているので+1してはいけない。<br />
Znowの更新はZnow=max(Znow, Z9)で良いのだが、区間の合計は単純なmax関数では計算できず、場合分けが増えるのでミスしやすくなってしまう。<br />
<br />
ここで半開区間を使う。<br />
Znow=Z0でZ3~Z9が得られた時、区間の合計は+(9+1)-3。<br />
Znow=Z5でZ3~Z9が得られた時、区間の合計は+(9+1)-5。<br />
Znowの値に関わらず同じ計算式なので、+(max(Znow, Zmin)+1)-max(Znow, Zmin)で良い。<br />
Znowの計算式もZnow=max(Znow, Zmax)で簡単。<br />
半開区間すげー。<br />
<br />
最後によくやるミスだが、intの範囲外になる部分をrepのint型の変数のまま計算してしまい、値が大きいケースにWAが連なってた。<br />
最後に直したのがこの部分なのだが、ここまでWA出るとなると考察から間違ってるのかと不安になる。<br />
気付けば、あーここかーという感じ。<br />
long longとして扱いたい部分はしっかりlong longにしていたのだが、計算式の途中でオーバーフローする部分をいつも忘れてしまう。<br />
気をつけよう。<br />
<br />
<strong>2019/12/17追記</strong><br />
区間をsetで管理するテクなるものがあるようで、典型チックと思った区間の管理部分をまさにやってくれてすごい。<br />
一番悩んだ部分がとっても簡単に書けた。<br />
satanicさんの実装を参考にしたつもりが、ほとんど別物になってしまった。<br />
<br />
競プロで基底クラスのポインタに入れるなんて頭のおかしいことはしないはずなので、本当はsetをpublic継承したかった。<br />
しかし書いているうちに区間の左端より右端で比較した方が良くないかという流れになり、pair(左端, 右端)を保ったまま格納するなら通常のsetだといけないということで、比較関数を色々弄っていくうちにスマートに書けないと判断してこの形に。<br />
正直mapの方が理にかなっているのだが、map[右端] = 左端の形は扱いづらすぎる。<br />
クラス内部のprivateなデータならともかく、map自体も外で使う可能性が十分ある中これはちょっと・・・となる。<br />
ま、まぁSTLをpublic継承なんて邪道だし？これで良いよね？<br />
<br />

<h3>まとめ</h3>
自分用メモだしなんでも良いかと見出しとかつけずに改行だけで乗り切る姿勢でいたのだが、あまりに見づらい・・・。<br />
考察と実装とまとめくらいなら頑張れる気がするので、しばらくこのスタイルで行こうかな。<br />
最近ブログレイアウトも変えた(元々横に広いのが良かったが見つけられなかった)のだが、コードのシンタックスハイライトの表示が崩れているっぽい。なぜ。<br />
改行も自動で消えるの毎回意味分かんないし忍者ブログが悪い気がしてならない。<br />
コード部分くらいは直したい。</div>]]></content:encoded>
    <dc:subject>競技プログラミング問題</dc:subject>
    <dc:date>2019-12-14T02:55:40+09:00</dc:date>
    <dc:creator>chlo</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>chlo</dc:rights>
  </item>
  <item rdf:about="https://ice.cos-mania.net/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E9%96%A2%E9%80%A3/pair%E3%82%92%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E5%8C%96%E3%81%97%E3%81%A6unordered_map%E7%AD%89%E3%81%AB%E5%85%A5%E3%82%8C%E3%82%8B">
    <link>https://ice.cos-mania.net/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E9%96%A2%E9%80%A3/pair%E3%82%92%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E5%8C%96%E3%81%97%E3%81%A6unordered_map%E7%AD%89%E3%81%AB%E5%85%A5%E3%82%8C%E3%82%8B</link>
    <title>pairをハッシュ化してunordered_map等に入れる</title>
    <description>ABC146 D Coloring Edges on Treeより


2つの値をkeyにして値を取り出したいことは割と多い。
mapで計算量が間に合うならそれでも良いが、想定解法とは違うがC++パワーでunordered_mapを使えば間に合うなんてことがあるかもしれない。
そのためにpairのハ...</description>
    <content:encoded><![CDATA[<a href="http://ice.cos-mania.net/競技プログラミング問題/20191126" title="" target="_blank">ABC146 D Coloring Edges on Tree</a>より<br />
<br />

<div>2つの値をkeyにして値を取り出したいことは割と多い。</div>
<div>mapで計算量が間に合うならそれでも良いが、想定解法とは違うがC++パワーでunordered_mapを使えば間に合うなんてことがあるかもしれない。</div>
<div>そのためにpairのハッシュ関数を作成した。<br />
<br />

<pre class="line-numbers"><code class="language-cpp">namespace std {
template <typename a="" typename="" b=""> struct hash&lt;pair&lt;A, B&gt;&gt; {
  size_t operator()(const pair&lt;A, B&gt; &amp;p) const {
    const static size_t rand_seed = random_device()() + 0x9e3779b9;
    size_t seed = rand_seed;
    seed ^= hash<a>()(p.first) + 0x9e3779b9 + (seed &lt;&lt; 6) + (seed &gt;&gt; 2);
    seed ^= hash<b>()(p.second) + 0x9e3779b9 + (seed &lt;&lt; 6) + (seed &gt;&gt; 2);
    return seed;
  }
};
}
</b></a></typename></code></pre>
</div>
<div><br />
64bit環境ならsize_tも64bitのはずなので、int型2つ並べるだけで衝突は起きないはずだが、より汎用的にするためにboost::hash_combineを真似た。</div>
<div>テンプレートの特殊化の本来の目的に沿うとpair&lt;int, int&gt;を別に指定するべきなのだろうが、普通に面倒である。</div>
<div>このハッシュ関数をテンプレート入りさせようかなと考えているし、32bit環境のオンラインジャッジもあるかもしれないので、汎用性 is 正義である。</div>
<div>速度的にもintを2つ並べる場合とほとんど変わらない。</div>
<div>数回程度の試行だが、5ms程度しか違いがなく、ハッシュが衝突したのかジャッジシステムの誤差なのか分からないレベルなので問題なく動作しているだろう。(ABC146 D Coloring Edges on Treeで測定)<br />
<br />

<div>一応動くようにはなったのだが、方向性を参考にした記事と見比べてみると乱数の使い方が違う。</div>
<div>参考にした記事では、初期seedを0とし、pair要素のhash値と同様にseedをシフトしたものと足し合わせている。</div>
<div>pairの値によって定まる部分を定数とおくと、こちらはseedをシフトして足し合わせる回数が少ないのと、足し合わせる順番が最初になっただけなので、記事の方法でランダム性が確保されるなら初期値を乱数にするだけでも良さそうな気がするのだが、正直全く分からない。</div>
<div>偉い人に教えてもらいたい。</div>
</div>]]></content:encoded>
    <dc:subject>プログラミング関連</dc:subject>
    <dc:date>2019-12-14T02:01:08+09:00</dc:date>
    <dc:creator>chlo</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>chlo</dc:rights>
  </item>
  <item rdf:about="https://ice.cos-mania.net/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E9%96%A2%E9%80%A3/%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%AB%E3%82%88%E3%82%8B%E9%85%8D%E5%88%97%E3%81%AE%E6%9C%80%E5%A4%A7%E8%A6%81%E7%B4%A0%E6%95%B0%E3%81%AE%E5%88%B6%E9%99%90">
    <link>https://ice.cos-mania.net/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E9%96%A2%E9%80%A3/%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%AB%E3%82%88%E3%82%8B%E9%85%8D%E5%88%97%E3%81%AE%E6%9C%80%E5%A4%A7%E8%A6%81%E7%B4%A0%E6%95%B0%E3%81%AE%E5%88%B6%E9%99%90</link>
    <title>メモリによる配列の最大要素数の制限</title>
    <description>ABC146 D Coloring Edges on Treeより


配列の最大要素数は気をつけよう。
int型は4byte。
AtCoderのメモリ制限は多くの場合1024MB。
配列に入れられるint型の数は1024*10^6 / 4 = 256*10^6 ≒ 2*10^8個。

int[N]...</description>
    <content:encoded><![CDATA[<a href="http://ice.cos-mania.net/競技プログラミング問題/20191126" title="" target="_blank">ABC146 D Coloring Edges on Tree</a>より<br />
<br />

<div>配列の最大要素数は気をつけよう。</div>
<div>int型は4byte。</div>
<div>AtCoderのメモリ制限は多くの場合1024MB。</div>
<div>配列に入れられるint型の数は1024*10^6 / 4 = 256*10^6 ≒ 2*10^8個。<br />
</div>
<div>int[N][N]を取りたい場合、N=10^4はOKだけどN=10^5だったらだめ！</div>
<div>long longでもN=10^4までいけるが、他の配列などでこれ以上大きなメモリ確保が難しそう。</div>
<div>単純計算だとこうなるが、vectorは余分にメモリ取るので、最大でこれの半分以下の要素数しか取れない。</div>
<div>通常配列は知らないが、vectorより大きくなることはないのでvector基準で考えておけば良い。<br />
<br />
</div>
<div>vector&lt;int&gt; v[N][N]</div>
<div>N=10^4まで。<br />
<br />
</div>
<div>vector&lt;long long&gt; v[N][N]</div>
<div>N=10^3まで。</div>]]></content:encoded>
    <dc:subject>プログラミング関連</dc:subject>
    <dc:date>2019-12-14T01:54:02+09:00</dc:date>
    <dc:creator>chlo</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>chlo</dc:rights>
  </item>
  <item rdf:about="https://ice.cos-mania.net/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3/abc147%E3%80%80%E5%8F%82%E5%8A%A0">
    <link>https://ice.cos-mania.net/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3/abc147%E3%80%80%E5%8F%82%E5%8A%A0</link>
    <title>ABC147　参加</title>
    <description>ABC147

順位: 785
パフォーマンス: 1446
新レーティング: 1050
差分: +73


4完
ご飯を食べながらちょっとゆっくり参加。
Cが難しいというかややこしかった。
Eは途中で頭おかしくならなかったらかなりワンチャンあった。


A問題
かんたん。
bustってブラックジャッ...</description>
    <content:encoded><![CDATA[<h3><a href="https://atcoder.jp/contests/abc147" title="" target="_blank">ABC147</a></h3>
<div><br />
順位: 785</div>
<div>パフォーマンス: 1446</div>
<div>新レーティング: 1050</div>
<div>差分: +73<br />
<br />
</div>
<div>4完<br />
ご飯を食べながらちょっとゆっくり参加。<br />
Cが難しいというかややこしかった。<br />
Eは途中で頭おかしくならなかったらかなりワンチャンあった。<br />
<br />
</div>
<h3>A問題</h3>
<div>かんたん。<br />
bustってブラックジャックで普通に使うのかな？<br />
<br />
</div>
<h3>B問題</h3>
<div>反転した文字列用意したら分かりやすくなるというテクニック。<br />
別にいらなかったね・・・。<br />
<br />
</div>
<h3>C問題</h3>
<div>ややこC。<br />
制約がbit全探索だけど貪欲的にも解けそう・・・？<br />
でもbit全探索の方が確実だからそっちで。<br />
C問題でbit全探索なんか使うか？とかなり訝しんだが、bit全探索なら解けるという絶対的な自信があった。<br />
Cにしては相当に実装が重かったのも訝しみポイント。<br />
直近で解いた<a href="https://atcoder.jp/contests/abc112/tasks/abc112_c" title="" target="_blank">ABC112&nbsp;C Pyramid</a>を思い出した。<br />
<br />
正直者を決めた場合、正直者が正直者と示した人のみを確認すれば良いと思ったのだが、サンプルが合わない。<br />
そうじゃなくて、正直者が正直者と示した人がさらに正直者を示して、と繰り返す必要があった。<br />
それを実装しようとしてキューに正直者入れるかと考えたところでbit全探索じゃなくなった。<br />
bitが指し示す正直者を使おうということでbit全探索に戻ってきた。危ない危ない。<br />
<br />
この実装でミスしてしまったのが、bitが立っているかどうかと正直者かどうかの一致判定。<br />
普段bitのi桁目のビットが立っているかどうかを調べる際、if(bit &amp; (1 &lt;&lt; i桁目))と書くのだが、これはifの条件式が0以外をtrue(=1)にキャストすることを踏まえており、i桁目のビットが立っていた場合に取り出される値は(1 &lt;&lt; i桁目)である。<br />
これをそのままif(0or1 == (bit &amp; (1 &lt;&lt; i桁目)))としてしまったため、1桁目のビットが立っていても(1 == 2)の比較が行われてfalseになってしまう。<br />
1にキャストされるから普段の書き方で良いというのは間違いなく頭に入っていたのだが、ふとしたところでミスる。<br />
これからはif((bit &gt;&gt; i桁目) &amp; 1)の書き方に統一します・・・。<br />
<br />
もう1つ書きたいことが、ビットの数え方のお話。<br />
実は競プロをやってみようかなと思い立ったきっかけがビット関連の演算。<br />
ビットを立てたり消したりMSBとか立っているビットの数え方とかすごい鮮やかだなぁと。<br />
別に競プロでしかビット使わないわけではないが、意識するのは組み込み系か競プロだろう。<br />
立っているビットを数える関数は2年くらい前に作っていて、たぶんそれ以来初めて使った。<br />
分割統治でO(log64)なのでほぼO(1)の実装。<br />
他のビットを数える系も大体分割統治でO(log64)でできるのだが、LSBはde bruijn sequenceとかいう闇の数字を使って真にO(1)で計算できることを最近知った。<br />
O(N)のRMQに使っている。<br />
立っているビットを数えるのも真にO(1)でできたら良いなぁ。<br />
<br />
</div>
<h3>D問題</h3>
<div>ここまで50分。<br />
相当きついと思いながらのD。<br />
C解いてる途中に質問タブが(1)となっているのに気づき、見てみると「Xor Sum 4」の文字が。<br />
EかFかなーうわー・・・、と思っていたのにD問題開いたらまさかの。<br />
<br />
見た感じ桁毎に分けられそうだしXor Sumだし、ということで桁ごとに分けて考える。<br />
どのAiも使われるのはN-1個なので、Aiを固定した際の合計を計算できれば良し。<br />
Aiのd桁目が1なら他のAi以外のd桁目が0のときにその桁が1、逆も然りと、普通にカウントしたら良いのでは？<br />
Xor Sumにしては簡単だけどなぁと思いながら実装するも普通にサンプル通ってAC。<br />
Cの遅れを少し取り戻せた。<br />
<br />
</div>
<h3>E問題</h3>
<div>ここまで63分。<br />
単純そうで難しそうだという第一印象。<br />
色々考察して、80&times;80のサイズと、ABも80までなのでその差も80までというのが鍵っぽい。<br />
差が80以内を使うということは、差の合計を0にするように足していく場合、差の合計の最大値は80&times;2くらいまでに収まることが保証できたりする？<br />
とりあえずDP使って解けそうだなぁ。<br />
<br />
ここまでかなり良い感じの考察だったのに、ここで頭がおかしくなる。<br />
こういう右か上かしか行けないABC145 D Knightでやったなぁ。<br />
確か全通りは、と思い出すより早いと解説PDFを見に行く。<br />
[右と上を選ぶ回数の合計]C[右を選ぶ回数]の簡単な組み合わせだ！<br />
つまり160C80 = 160*159/2 = 12720だ！<br />
<br />
？<br />
ちょっと頭に思い浮かべたのが3&times;3のマスで4C2 = 4*3/(1*2)となり、なぜかそのノリのまま計算してしまった。<br />
そこから全通り調べて最小値調べれば良いかなぁと。<br />
この時点で頭おかしくなってるので次もおかしい。<br />
最大80だし(?)、通った|Ai-Bi|を大きい順にソートして、合計が正ならマイナス、負ならプラスで合計して行けば必ず最小値になるのでは！？<br />
そんなわけない、貴様ナップサック問題知らずか。<br />
で実装して間に合わなくて、コンテスト終了20分後くらいにそのままの方針でTLE出して終わり。<br />
5,5,4,3,3とかの場合、5+5-4-4-3=0にできるが、上から順にプラスマイナスの方針だと5-5+4-3-3=-2になってしまう。<br />
ということで色々だめ。<br />
<br />
良さそうな解法は、最初の考察を進めて、差は80以内になるなら全部プラスで計算しても80*160=12800になるので、DP[x座標][y座標][現在までで作れる合計値]でDPしていく。<br />
80*80*12800=81920000 &lt; 10^8でたぶん間に合う。<br />
あんまり解説読んでないけどたぶんこれで行けると思うので、後で改めて解いてみる。<br />
実際全部プラスなんてことはないので、間に合わなければ少し節約できそうか？<br />
<br />
</div>
<h3>F問題</h3>
<div>Eと一緒に問題を眺めて、シンプルな問題で解けそうな解け無さそうなわからなかったので、順位表見たら圧倒的に難しそうだったのでパス。<br />
シンプルな問題は簡単かやべーか二択だな。<br />
<br />
</div>
<div>
<h3>まとめ</h3>
Cで時間溶かしたのは反省だが、間違いなく今回のCは難しかった。<br />
Eは解けても良かった。<br />
今までの解けても良かったよりかなり強めの解けても良かった。<br />
全通り調べても良いなんて意味分からないことを考えなければ、次に進めるのは最初の考察の続きなので、80*160しても制限に収まると気づく可能性は十分あっただろう。</div>
<div>レートは順調に伸びてるものの、次も4完なら水色は厳しそう。<br />
年内はAGCが1回予定としてあるが、ABCはもうないのかな。<br />
AGCも参加する予定だが、できれば後1回ABCで余裕持たせてほしい。</div>]]></content:encoded>
    <dc:subject>コンテスト参加感想</dc:subject>
    <dc:date>2019-12-09T21:47:07+09:00</dc:date>
    <dc:creator>chlo</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>chlo</dc:rights>
  </item>
</rdf:RDF>
