あああああ

オタク & 競プロ

AtCoder 六段 3000 になりました

あ

3000で書いてしまう人は史上初じゃないか?

記憶を辿ってみると三大コンテストで3000になりたいみたいに言ってた時期が長かった気がしていて、ついに制覇したので(AtCoder Codeforces Topcoder)

Topcoderは消滅してるというギャグなんですが、三大世界大会はさらに悲しく残り一個になってしまった、今だと追加でAWTFとyandexになるのかな

 


0-2400 1年

2400-2800 2年

2800-3000 4年

終わりです

2034 年 3100 を目指そう

 

練習方法(?)

昔りんごさん講座というのがあって、そこでは千の位が 3 の人は好きに練習してくださいと言っていた記憶がある。免許皆伝やったぜ

実際赤くなるころには何が練習になって何が練習にならないかある程度わかると思うし、割と何をやっても実力向上には繋がるが、何をやってもレートはろくに上がらないということがわかっていると思うのでなんでもいいと思いつつ、気分で色々やってみたので所感とか

赤になる前にやった練習は飛ばします、まあ割と一般的なやつ(rated出てABCとARC埋めて他JOIとかICPCとかひたすらやる)が王道すぎる

対象読者は不明です、そもそも自分もCFカスすぎてもう教えてほしい

 

コンテスト参加

rubikun.hatenablog.jp

だいたいこれ

詳細

  • おすすめ度高いやつは大体全部出ている
  • solved.ac は消滅した
  • Repovive ってやつに最近たまに出ている
  • UOJ にも出ている
  • UCup は Season 2 〜 4 の終盤までソロ参加した、100 セットぐらい、今はチーム組んでもらっている

感想

  • rated はまあ出るとして、unrated についてはこのあたりだとライバルももういつもいるなこの人って感じの人ばっかりになってきて、誰かが通してたら自分も通したいし速度も勝ちたいしという感じで意外とモチベを出しやすい
  • 新たな典型を学ぶ効率がいいかというと、微妙、、、おそらく高難易度コンテストを意識してupsolveしないと全完するだけで疲弊して終わる(自戒)
  • 5hソロは詰まった時に次の問題に行くときの難易度差が小さめなのでそこで冷静にやる練習になる、あと残り2hぐらいで、この3問解こう、という現実的なラインが見えることが多くて、これは可能枠同配点が複数あるときの練習になると思った、簡単枠ギャグの早解き練習にもなるがこれはCF Div.2で足りるかも、脳の体力はついてるんですかね?わからん

宣伝

Codeforces Div.2/ECR で 日本の有志でGP30のスコアをつけて競う企画を 4 年以上やってます(3ヶ月ごとのシーズン制)

スコア獲得できるレベルの人で興味ある人いたらお気軽にフォロリク(discordでも可)ください、それ以外にも出るべき生えたコンテストまとめてスケジュールを投稿しててたぶんそれは有用です

非競プロ向けも含めたくさんアカウントあるんですがなんか競技やってそうだな、って感じのやつです

 

AtCoder 埋め

rubikun.hatenablog.jp

おおよそこれ + RPSも 1 位にした

無限虚無埋めして稼いどいて何言ってるんだという感じですが、AWCってやつはさすがに時間使う意味なさそうなのでそのうち抜かれるの確定している、性格的に毎日問題が追加みたいなのと相性が良くない、のんびりやりたいので

感想としてはどうなんだろう?昔よりは縦埋めもdifficulty埋めもやりにくい(全埋めを達成しにくい)というのはあると思っている、シンプルに問題数も増えたし

自分の感覚として飛ばすという選択肢を持ってしまうと諦めやすくなってしまうかも、そういう意味では後発サービスが出てきているのは歓迎するべきなのかもしれない

 

Codeforces 埋め

CFには自分で問題とか選んでバチャを立てる機能があります(group作って招待とかもできた気がする)

黄色とかの時にDiv.1 virtualやった時と比較すると、各セットで解ける問題が 1,2 問上になっていることを考えると、そのときのunsolvedを触らないというのはもったいなくないか?ということで、difficulty(2400-3100)ぐらいの問題を 5 個ずつぐらい集めて 3 h virtualをやる、というのをこっそりやっていました

まあ 10 セットぐらいやってやめたんですが、、、(カス 1 )

いいところとしてはまあ 2020 ぐらいからはさすがに結構まとも(全然出てないで今でも質がとか言ってる人は老害だと思っています)なので、解くべきというのは事実

よくないところとしては、virtualにする意味がない、かつ自分があまりvirtual好きではない

あと一人でそれやるのは孤独すぎるが人誘うと誰か解いてがちで問題選びがだるい

いやー全埋めは無理にしてもまあ見てない適正難易度はもうちょい埋めた方がいい気がするなあ

 

yukicoder 埋め

数え上げ

さすがに数え上げやらんと勝てなくね?という気持ちになった時があって、基本ジャンル埋めはやらない主義だったんだけど数え上げ練習をすることにした

AtCoderとかCFは他の練習方法もあるのでじゃあ日本人結構出してるしyukicoderかな〜と

No1000〜3000ぐらいの星3〜5でmodが書いてあるやつはだいたいやった(300問ぐらい)

5.5以上だったりシンプルに解けてないやつは飛ばしていて、あとほんとに見た瞬間確信できるやつは脳内ACでやめてる、これはなぜかというと星3ぐらいから詐称が入るため簡単枠かもしれないのもみる必要があり()

感想としてはまあ実力は結構上がったんじゃないでしょうか、ほんとに基礎的なFPS式変形のノック的な立ち位置としてgood

 

セット埋め

昔ってyukicoderの質がもうちょいバラバラで全く出てなかったんだけど、ARC writerとかが過去に書いてるセットは擬似virtualをやった記憶がある、virtualあんまり好きではないのでたぶん5セットぐらいしかしていない(カス 2)

 

SRM 埋め

rubikun.hatenablog.jp

Div.1 hard ちょっくらやろうと思ってたんだけど、見た目が虚無すぎて数日でやめた(カス 3)

AI 使えばたぶんもっとリッチな見た目にできるはずで、自分は縦埋めが一番好きなので復活可能性あり

 

QOJ 埋め

海外OI

10問ぐらいだけやった、ゴミ

やる価値のあるセットって、OI は特に全完は無理じゃないですか、こういうときってどうやって取り組む難易度帯を決めてるんですか?JOIは素晴らしい難易度表があるのでやりやすいんだけど(なお 12)

自分の感覚として結構 OI は格上枠でも考えることで得られるものが多いので上を広めにやってもいいと思っているんだけど

やっぱり若返りして中国でコーチをつけるしかないかな〜笑

 

UCup

Final行くぞ!ということで 9 月中はSeason 1 のupsolveやろうかな、けど既に解いたやつの提出消えてるの埋め直すのだり〜→全然解法覚えていなくて涙、となっていたんですが、なんかもう来週からSeason 5 やるよという情報が入ってきていて、終了です

けど今の目指すところってレート周りは結構苦しいことを考えるとUCup力つけるの優先度高いよねと思うので、しばらくは 5 のupsolve込みで真面目にやろうと思います

 

UOJ 埋め

古い方から公式Roundの本番ACが出てそうなやつにちまちま取り組んでいた、100問ぐらい?

UOJはすごいので、面白くてかなり練習になるんですが、むずい

要求知識も10年前とかですら追いつけていない(beats CF blogのhistoric informationが11年前だったりapiad FPS blogのChain Reactionが12年前だったり)

今って翻訳の壁がだいぶ低いからやりやすいんじゃないかなと思う

 

動画撮影

www.youtube.com

笑

これ結局他の人に実力もトークも動画の見た目も勝てないのであまりやっていない、VOICEPEAKシリーズちょっと見た目が好きで気になってたんだけど、喋っただけで勝手に変えてくれるとかではなくて入力する必要があるらしく、それは時間がだるくて涙

撮影すると最初数回は露骨にパフォーマンス落ちてたから昨今の流れを考えるとやっておいてよかったなに

手元を撮っていないので見返すことはしていません

まとめ

労働のおかげで見出しとか箇条書きとかを覚えました、そ、そんな

ふらふら浮気ばっかりしていることがわかる

トップ層への憧れドリブンでやっている面もあるためなんかアンテナを真面目に貼るといろんなサイトが引っかかってしまう、例えばUSACOはwriterがBenqばっかりですごい

自由色どうするか考えて過ごしたいと思います

自由色何にするか考えたことある人あるある→固定色とそれに似た色でほとんどの色カバーされてて困る

甲子園の準々決勝の対戦相手は等確率か?

高校野球と確率が好きなので

 

前提

2026 夏の甲子園は、3 回戦を 2 日間かけて行い、ベスト 8 が各日 4 チームずつ決まり、そのチームで再度準々決勝の組み合わせ抽選を行う。この時完全ランダムではなく、1 日目に決まった 4 チームが準々決勝の 1, 2 試合目に、2 日目に決まった 4 チームが準々決勝の 3, 4 試合目になるようにルールを設定しているため (これ嘘でした、みんな勘違いしてたから許して)、実際は対戦相手は 7 択ではなく 3 択になる。さらに、試合間隔が近くなりすぎないように、各日で最後(4 番目)に決まったチームは、後ろの方の試合、つまり 1 日目の最後に決まり = 2 試合目、2 日目に最後に決まり = 4 試合目、になることが確定している。3 回戦は 1 試合ずつ順に行い、勝ってベスト 8 になった瞬間にそのチームがくじを引く、という手順になっていることに注意。

このとき、対戦パターンは 1/3 ずつで等確率か?について考察する。

ちなみに準決勝も今年は同じ理屈らしい。

以下、4 チームを決まった順に ABCD 、準々決勝の 2 試合を順に XY と呼ぶ。

抽選パターン1

野球について何も考えずに想像するとこうなる方式

ABC は勝ったら X か Y かのくじを引く。くじには XXY が入っている。D は Y 確定なので引かない。

この場合は A の相手が BCD いずれになる確率も 1/3 なので(くじ引きの当たりを引く確率は順番によらない)対戦相手は等確率となる。

 

 

 

...ゴミ記事乙

 

 

 

ではなくて、野球では一塁側三塁側が存在する!!!

もちろんこの方式で X か Y を引いた後で、(片方が埋まっていなければ)一塁側か三塁側かのくじを引くシステムにしておけばうまくいくが、少し管理が煩雑でなさそうに思える。(X一塁側, X 三塁側, Y)にしておいて Y を引いたら一塁側か三塁側かのくじを引く、というのも同様(こっちの方があるかもね)

 

1 ステップで終わらせたいので、こういうくじはどうだろう?

 

抽選パターン2

くじには (X 一塁側, X 三塁側, Y 一塁側, Y 三塁側) が入っている。どこかが Y のいずれかを引いた瞬間にもう一方の Y を取り出して、D がそれを引いたことにし、残りのくじで続行する。

この方式は、一塁側三塁側を考慮すると 1 ステップで終わりとても自然に思えるがこの場合はどうなるだろう?

  1. A が Y を引いた場合
    2/4 = 1/2 の確率でそうなるが、この瞬間実は A vs D , B vs C が確定する。
  2. A が X を引いた場合
    a. B が X を引いた場合
       2/4 * 1/3 = 1/6 の確率でそうなるが、この場合は A vs B, C vs D となる。
    b. B が Y を引いた場合
       2/4 * 2/3 = 1/3 の確率でそうなるが、この場合は A vs C, B vs D となる。

 

なんと、A の対戦相手が BCD になる確率は順に 17%, 33%, 50% で大きく異なる!

 

まとめ

ということでぱっと見そんなに変わらない抽選方式で大きく確率が異なるよ、という話でした。どうなっているかはくじを引いた人や関係者しかわからないため、ただの予想でしかないし、まあ極論最初のトーナメントは完全ランダムなので、広い目で見るとどの方式でも等確率と言えるかもしれない。

 

おまけ

極論最初のトーナメントは完全ランダムと書いたが、嘘です。

夏の甲子園では、49 チーム参加するのですが、この数はトーナメントとの相性が非常に悪く、1 箇所大はずれと言える組み合わせ位置があります。そこは、2 回戦スタートにも関わらず 1 回戦の勝者と当たるため、場慣れなどの点が響いて勝率が非常に低くなっています。(詳しくは組み合わせを見てください)

また、なんで 47 都道府県なのに 49 チームなの?というと、東京と北海道は 2 チームずつ出ているためです。ここで、東京対決や北海道対決を初戦でやるのはやめよう、ということで、最初のトーナメント抽選で少し手を加えています。これがミソです。

49 枠を A 25 枠と B 24 枠(逆かも)に分けて、A vs B が初戦になるようにします。大はずれは A に入れます。これで、東京 = A, 北海道 = B のように最初に決めておけば、東京対決や北海道対決は絶対に起こらないね、という仕組みらしいです。

しかし、実はこれをすると大はずれを引かない目的で考えると損得が発生しています。

東京の片方のチームの立場になって考えてみましょう。

  1. 東京 = A の場合
    1/2 でそうなり、大はずれになる確率はそのうち 1/25 です。
  2. 東京 = B の場合
    1/2 でそうなり、大はずれになる確率は 0 です。

つまり、大はずれになる確率は 1/50 で、実は他県に比べて得しています!!!

 

まあ微差すぎるのであんまり関係なく、以上です。(大はずれを引いて初戦東京対決、みたいなのはあり得るんだろうか?ここらへん隠れまくっているから謎)

 

Growing Vegetables is Fun 5 (JOI) 別解

問題

https://atcoder.jp/contests/joisp2024/tasks/joisp2024_f (難易度11)

 

解法

 

N 通り試す方法は理解しているものとします。

 

適当に rotate して min ( A[0], A[1], ..., A[N-1] ) >= max ( A[N], A[N+1], ..., A[N+N-1] ) にできるので、しておく。B と C もソートしておく。

(これさえできれば A の条件もう少し弱くても O(NlogN) になると思っています。)

 

B と C を swap して 2 回解くとして、0 <= s < N なる s を用いて、[s, s+N) を B と、[s+N , s+N+N) を C とマッチさせるものについて調べる。

 

このとき、 s を increment すると、B の各要素のマッチ相手の値は単調減少、C の各要素のマッチ相手の値は単調増加する。

s を 固定したときの B のマッチ相手を X , C のマッチ相手を Y とする。(どちらも長さ N の ソートされた配列)

| x - y | = max ( x - y , y - x ) を用いると、疲労度は

max ( B[i] - X[i] , X[i] - B[i] , C[i] - Y[i] , Y[i] - C[i] )

= max ( max( B[i] - X[i] , Y[i] - C[i] ) , max ( X[i] - B[i] , C[i] - Y[i] ) )

と書ける。

s を increment すると、max 内の 1 個目の max は単調増加、2 個目の max は単調減少になるため、1 個目 - 2 個目 >= 0 となるギリギリの s を二分探索で求めれば良い。

X, Y の取得は単調列 2 個のマージなので O(N) でできて、トータル O(NlogN) で解けた。

 

提出 (fastest)

https://atcoder.jp/contests/joisp2024/submissions/72642828

 

Topcoder SRM オフラインジャッジを作った

開発堕ち

まあ AI に聞いただけなんだけど

https://archive.topcoder.com/ProblemArchive

SRM フォルダを作って、中に solution.cpp (解法,これは本番通りにclassで書く) と tests.txt (各問題を開いて全てをコピペしたら良い) と judge.py (中身は後述) を置く

python3 judge.py をしたら、

=== testproblem | 3 Cases ===

Case 00: [ TLE ] (3.0s exceeded)
Case 01: [ TLE ] (3.0s exceeded)
Case 02: [ OK ] (0.0000s)

===================================
 最終結果まとめ
===================================
 OK: 1 | NG: 0 | TLE: 2 | RE: 0
 Max Time: 3.0000s
===================================

みたいなのが出てくる

judge.py の中身はこちら

import os
import subprocess
import re
import time

# ----------------------------------------------------------------
# 1. 判定ロジック(double誤差判定)
# ----------------------------------------------------------------
def check_double_error(actual_str, expected_str):
    try:
        a_vals = re.findall(r"-?\d+\.?\d*(?:e[-+]?\d+)?", actual_str)
        e_vals = re.findall(r"-?\d+\.?\d*(?:e[-+]?\d+)?", expected_str)
        if len(a_vals) != len(e_vals): return False
        for av, ev in zip(a_vals, e_vals):
            a, e = float(av), float(ev)
            if a == e: continue
            abs_err = abs(a - e)
            rel_err = abs_err / max(abs(e), 1e-18)
            if min(abs_err, rel_err) > 1e-9: return False
        return True
    except: return False

# ----------------------------------------------------------------
# 2. 問題文のパース
# ----------------------------------------------------------------
def parse_all_content(content):
    config = {}
    try:
        config['class'] = re.search(r'Class:\s*(\w+)', content).group(1)
        config['method'] = re.search(r'Method:\s*(\w+)', content).group(1)
        params_raw = re.search(r'Parameters:\s*(.*)', content).group(1)
        config['args_types'] = [p.strip() for p in params_raw.split(',')]
        config['returns'] = re.search(r'Returns:\s*([\w<> ]+)', content).group(1).strip()
        num_args = len(config['args_types'])
    except: return None, []
    
    examples_part = content.split("Examples", 1)[1] if "Examples" in content else content
    lines = [l.strip() for l in examples_part.split('\n') if l.strip()]
    cases = []
    for i, line in enumerate(lines):
        if "Returns:" in line:
            expected = line.replace("Returns:", "").strip()
            args = lines[i - num_args : i]
            if len(args) == num_args: cases.append({"args": args, "expected": expected})
    return config, cases

def format_cpp_value(raw_val, type_str):
    raw_val = raw_val.strip()
    if "vector" in type_str: return raw_val if "{" in raw_val else "{" + raw_val + "}"
    if "string" in type_str: return raw_val if raw_val.startswith('"') else f'"{raw_val}"'
    return raw_val

# ----------------------------------------------------------------
# 3. メイン処理
# ----------------------------------------------------------------
def run_judge():
    if not (os.path.exists("tests.txt") and os.path.exists("solution.cpp")):
        print("Error: tests.txt または solution.cpp が見つかりません。"); return

    with open("tests.txt", "r", encoding="utf-8") as f:
        content = f.read()

    config, cases = parse_all_content(content)
    if not config or not cases:
        print("Error: 問題文を解析できませんでした。"); return

    # C++ドライバー生成
    switch_cases = ""
    for i, case in enumerate(cases):
        cpp_args = [format_cpp_value(v, t) for v, t in zip(case['args'], config['args_types'])]
        switch_cases += f"""
        case {i}: {{
            auto start = chrono::high_resolution_clock::now();
            auto res = sol.{config['method']}({", ".join(cpp_args)});
            auto end = chrono::high_resolution_clock::now();
            chrono::duration<double> diff = end - start;
            print_val(res);
            cout << "\\nTIME: " << fixed << setprecision(6) << diff.count() << endl;
            break;
        }}"""

    driver_code = f"""
#include <iostream>
#include <vector>
#include <string>
#include <iomanip>
#include <chrono>
#include "solution.cpp"
using namespace std;
template<typename T> void print_val(const T& v) {{ cout << v; }}
template<> void print_val(const double& v) {{ cout << fixed << setprecision(15) << v; }}
template<typename T> void print_val(const vector<T>& v) {{
    cout << "{{";
    for(size_t i=0; i<v.size(); ++i) {{
        if(i>0) cout << ", ";
        print_val(v[i]);
    }}
    cout << "}}";
}}
int main(int argc, char** argv) {{
    if(argc < 2) return 1;
    int id = atoi(argv[1]);
    {config['class']} sol;
    switch(id) {{
        {switch_cases}
        default: break;
    }}
    return 0;
}}
"""
    with open("temp_driver.cpp", "w", encoding="utf-8") as f:
        f.write(driver_code)

    ext = ".exe" if os.name == 'nt' else ".out"
    cmd_ext = "./test" + ext if os.name != 'nt' else "test" + ext
    
    # コンパイル
    comp = subprocess.run(["g++", "-O3", "-std=c++20", "temp_driver.cpp", "-o", "test"+ext], capture_output=True)
    if comp.returncode != 0:
        print("=== Compile Error ==="); print(comp.stderr.decode()); return

    print(f"=== {config['class']} | {len(cases)} Cases ===\n")
    
    stats = {"OK": 0, "NG": 0, "TLE": 0, "RE": 0, "max_time": 0.0}
    is_double = "double" in config['returns'].lower()

    for i in range(len(cases)):
        try:
            # 3.0秒のタイムアウトを設定
            res = subprocess.run([cmd_ext, str(i)], capture_output=True, text=True, timeout=3.0)
            
            output_lines = res.stdout.strip().split('\n')
            actual = ""
            elapsed = 0.0
            for line in output_lines:
                if "TIME: " in line:
                    elapsed = float(line.replace("TIME: ", ""))
                else:
                    actual = line

            stats["max_time"] = max(stats["max_time"], elapsed)
            expected = cases[i]["expected"]
            success = check_double_error(actual, expected) if is_double else (actual.replace(" ","") == expected.replace(" ",""))
            
            if success:
                print(f"Case {i:02}: [ OK ] ({elapsed:.4f}s)")
                stats["OK"] += 1
            else:
                print(f"Case {i:02}: [ !! ] NG ({elapsed:.4f}s)")
                print(f"   期待: {expected} | 出力: {actual}")
                stats["NG"] += 1

        except subprocess.TimeoutExpired:
            print(f"Case {i:02}: [ TLE ] (3.0s exceeded)")
            stats["TLE"] += 1
            stats["max_time"] = max(stats["max_time"], 3.0)
        except:
            print(f"Case {i:02}: [ RE ] (Runtime Error)"); stats["RE"] += 1

    print(f"\n" + "="*35 + f"\n 最終結果まとめ\n" + "="*35)
    print(f" OK: {stats['OK']} | NG: {stats['NG']} | TLE: {stats['TLE']} | RE: {stats['RE']}")
    print(f" Max Time: {stats['max_time']:.4f}s")
    print("="*35)

if __name__ == "__main__":
    run_judge()

バグってるかは知りません、スペシャルジャッジは見なかったことにしよう
本当に問題文コピペだけでいけるのは偉いと思った、room移動で10分待ちなんてなかったんや


おまけ

javascript:(function(){var tables=document.getElementsByTagName('table');for(var i=0;i<tables.length;i++){var rows=tables[i].rows;if(rows.length>0){var lvlIdx=-1;var catIdx=-1;var headerCells=rows[0].cells;for(var j=0;j<headerCells.length;j++){var txt=headerCells[j].textContent.replace(/\s+/g,' ').trim();if(txt.includes('Div. 1 Level'))lvlIdx=j;if(txt.includes('Categories'))catIdx=j;}if(lvlIdx!==-1){for(var r=0;r<rows.length;r++){var row=rows[r];if(catIdx!==-1&&row.cells[catIdx])row.cells[catIdx].style.display='none';if(r>0){var levelCell=row.cells[lvlIdx];if(levelCell){var val=levelCell.textContent.trim();if(val!=='3')row.style.display='none';}}}}}}})();

で問題タグを消してDiv.1 hardだけ残せるようになった
chromeで、アーカイブをブックマークして編集でこれを打っておいて、アーカイブリンク開いてからブックマークを押すと動いた

日本最強プログラマー学生選手権 引退 感想まとめ

突然進学を目指さない限り学生としては出られなくなるので思い出せる限り全部書く

列挙時は敬称略している

 

 

第一回

2019 予選ARC 決勝オンサイト200人

予選 451位 競プロ始めて3ヶ月とかの時に予選があって逆ボーダーで落ちた

決勝イベントとかいうのはあったけど、決勝戦った人のコンテスト会話に加われないのしんどそうで辞退した、このスタンスが6年間続いてるのウケる

 

第二回

2021 オンラインABC

53位 負けたこと以外記憶がマジでない

この時の自分は早解きが高レートほどできるわけでもないのに強い人ぶってunrated全然出てないし勝てないのは当たり前という気がする

 

第三回

2022 予選ABC 決勝オンサイト50人

 

予選 まあこの頃にはABCなら学生50人には入るよねというレベルだった気はする

 

決勝 18位

Bでbeatsを使ったことだけ覚えている

DE解けず この頃は結構ARCとAGCの中間という話がされてた記憶

 

懇親

heno,maspy,kotatsugameで海鮮丼を食べに行った、翌年には閉店してて悲しかった

codechef(lunchtime,cook-off)を勧めたらそれ以降ほとんど開催されなかったということだけ覚えている

 

当時の感想コピペ↓

最後の方までいたら非赤自分だけになってて草だった
神々の話を盗聴できたり食事もいけたりして充実してました

話をしてARC-Fちょっとみてみようという気になった

コンテスト大量に出てる人にupsolveどうしてますか?って聞きまくったけどみんなあんまりできてないですという感じだった
まあupsolveバリバリやってます!とは絶対に言いにくい

Nyaanの近くで長く行動してたから解説の話を何度もされていて面白かった <-ABC8問になってから初ということで懐かしい

 

第四回

2023 予選ABC 決勝オンサイト50人

 

予選 前回と同じ感想

 

決勝 7位 (25k)

Aでペナ出したの病気なんだけど普通に体ガチガチだったから仕方ない

top2以外はそこそこ詰まってるから微妙に悔しさはあるけどまあ良かったです
Dで0かXかYかX^Yのどれ使うか固定できた後の問題をずっとbinary trieベースでやってて苦しかったけど、逆に一般化したらxor畳み込みになると気づいたときの脳汁は過去最高クラスあった

問題面白かった、オンサイト初入賞だと思う、喜びがツイートに出ている

UCupは事前にバチャして、帰宅後はCF Div.1 3hがあったらしい

 

懇親

heno,potato,maspy,kotatsugame(レート順)でカレーナンを食べに行った、美味しかった

レート高い順に出していくのはどうですかで勘弁してください状態になったそうです

 

第五回

2024 予選ARC 決勝オンサイト50人

 

予選 8位

ARCはちょっと事故があるから警戒していた気がする

 

決勝 4位 (50k)

4位だった、現金5万はでかい
帰った人にメダル取られて悲しすぎる
D FAで草
7位→4位なので来年は?

とのことです

BMBMで前計算の範囲をちゃんと勉強してなかったペナで4位になってしまった、メダル羨ましかったのを覚えている、なお次のAJOでもペナで4位

この年はかなり知識寄りと言われてた、まあ前回とかよりはそうだと思う、自分みたいなのはライブラリ勢とかを除くと他の学生よりは知っているので有利だったかも、しかし非学生の強者には全く敵わず黙ってしまう(情けない)

帰宅後は3-8でUCupに出た

 

懇親

maspy,kotatsugame,rniyaとジョナサンに行った、それなりに立食で食べたのでミニ丼を食べた気がする、意外と美味しかった

kotatsugameさんがABCに出ているのをみてた記憶がある

ライブラリ整備を勧められてこれをきっかけにスニペットを導入することにした、役立っています

 

当時の感想コピペ↓

元気な人が多くて普通に帰りたい

BMBMで3N必要らしいところを2Nでやってそのペナ差で無事モブ化(参加者の方はw) <-これは写真撮影の時に1〜3位は前列で別の呼び方をされていたが、4〜10位は参加者と呼ばれて悲しかったみたいな話だったと思う

それなりに現役でいたことへのご褒美みたいなセットだった

卒か退(放)かわからんけど来年がラストです <- 卒おめでとう...

maroonさんの脳内がapiadから変化しているな <- 脳内で〇〇に参加させると無限に解かれるというネタ

 

第六回

2025 予選ARC(〜2799) 決勝オンサイト50人 今年

 

予選 19位

admin変わった & 最終年だし事故りそうで嫌だなと思っていたが、かなり典型寄りで助かった、安心したとかで(言い訳)後ろの速度は遅い

 

決勝 3位 (60k)

前述の通りメダルが欲しかったので嬉しい
A sumだけだとサンプル2まで合うけど当然嘘でその後も迷走して40分経過して放置
C すぐ解けて実装含め10分、恥ずかしいので潜伏
B 愚直チェック+貪欲でいいので書く、40分ぐらい ここでトイレに行ったらAが解けた(下から)
Cを出す

順位表を見て時間を気にしながらAを書く、7分
4秒差で笑
Eちょっと見てやめてDに行く
M=3/4×N^2とかだとシャッフル乱択したらだいたい作れそう、で終わり

A詰まったのはわからん、2べき同士をマッチングさせる4〜5乗解法になってからもすぐに高速にできなかった

変な順でやるのは基本しないけど、冷えたせいでやる羽目になって色々聞いてもらえたのは面白かった

表彰は最初メダルを忘れられていて焦った

AJO4位のときに一言コメントで緊張して日本語を話せなかったから今回はそこそこ普通のことを言えてよかった

今だから言うと、さすがにtop10入れなかったら冷えだと思って今回は参加していたが、ARC体制が変わってから明らかに速度で負けてることがわかってしまった人が3,4人いるからどうしたもんかねと思っていた、AC count 1 で優勝を2連続でやられるとさすがすぎる

 

懇親

今年の立食は好みのメニューが多かった、ローストビーフと寿司が好きなので

UCup Semifinalのために夜ご飯を誰かと、ができないし急ぐことが確定していたので初手で会話を放棄して3周した、返ってきてもうちょい食べたかったなと思った、ありがち

potato,kotatsugameと基本話していた気がする

UCup Semifinalの話で、後日出るって言われて旅行ツイートも見たから普通に納得していたんだけど、事情を知って、こたつがめさん後日出るとか言ってたような気がするんですけどあれは嘘ってことですか?許せね〜になりました(言えないのはそれはそう)

 

他

気分が良かったためsnukeさんに突撃しに行った、色々聞けた

あと同意書の印刷で会場近くのファミマに寄ったらコピー機使ってる人が同目的の人っぽくて面白かった、このままの画面にしてもらっていいですかというか悩んだが結局コミュニケーション難なので自分でやった、機械音痴なので時間がかかった

 

終わり

ほぼ確実に行ける大会がなくなってしまった

AJOと支給あり海外オンサイトを目標にやっていきます

AWTFも実は今16位で日本1位になっているんだけどさすがに厳しいかな、このまま終わっていたらたぶん中国勢がみんな来るわけではなくて通過ワンチャンあったが早速生えている

有志オンサイトは良さげなのはrated被りがなければいきたい(5h系とか)

中国OIの話

自分の理解についてまとめる

https://codeforces.com/blog/entry/131266 と Qingyu のツイートを見て推測

 

 

CSP-J -> CSP-S -> NOIP -> Provincial Team Selection (省选) -> NOI -> CTT -> CTS の順?

CF diff はボリュームゾーンについて書く、簡単/難しい問題は1段階ずれるのもあるっぽい

qoj 以外にも loj とか luogu にもジャッジがありがち? 解説は中国ブログを読解するしかなさそうな気配

 

1. CSP-J

簡単らしい (diff 1200〜1600)

 

2. CSP-S

https://qoj.ac/category/272 簡単目 (diff 1600〜2000 を解くと良い結果らしい)

 

3. NOIP

https://qoj.ac/category/8 CSP-S と同じ?(どちらも中高難易度は diff 2000〜2500)

 

4. Provincial Team Selection (省选)

省ごとに10人ぐらい選抜 

https://qoj.ac/category/69 (diff 2500〜3000 を解くとだいたいの省では通る)

 

5. NOI

300人から50人に絞る(この50人がNOI金)

https://qoj.ac/category/7 (diff 3000〜)

 

6. CTT

50人から30人に絞る

https://qoj.ac/category/94

 

7. CTS

代表決定(実際には6,7に加えてコンテスト以外の評価点も少しあるらしい)

https://qoj.ac/category/109

 

謎1 中国国家队集训

https://qoj.ac/category/335 過去問を使ってると書いてあるし、ただのトレーニングとかなのかなと予想

これに限らず、過去問をいろんなとこ (AC,CF,OI,camp系すべて) から集めてコンテストにしたものが調べるとかなりの数ある

 

謎2 China Team Homework (集训队作业 / 集训队互测)

https://qoj.ac/category/110

代表選抜過程で作問が求められるので、各選手が作った問題?50問あるしたぶんそう

 

謎3 UNR (UOJ NOI Round)

アカウントがあれば誰でも出られる

NOI直前の模擬コンテスト的な感じだと思う

 

2024年まとめ

続き

rubikun.hatenablog.jp

 

レート

AtCoder 2741 → 2843 → 2823 (+82) (highest 2843) 

Codeforces 2731 → 3005 → 2874 (+143) (highest 3033) 笑

topcoder 3154 → 3094 (-60) (highest 3170)

codechef 2903 → 2940 (+37) (highest 2940)

DMOJ 2911 → 2921 (+10) (highest 2921)

toki 2717 → 2891 (+180) (highest 2891)

 

精進

AtCoder 5758 → 6681 (+923) (2位→1位→2位)

RPS 1353150 → 1625650 (+272500) (4位→3位)

Codeforces 3028 → 3511 (+483)

AOJ 763 → 791 (+28)

yukicoder 319 → 516 (+197)

Library Checker 28 → 34 (+6)

CodeChef 193 → ? (+?)

topcoder 194 → 202 (+8)

Sum 10283 → 11735 (+1452)

AOJ-ICPC 257750→260850 (+3100) (5位→5位)

Project Euler 352 → 450 (世界435位,日本25位)