以下の内容はhttps://rubikun.hatenablog.jp/より取得しました。


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位)

 



 

 

Codeforces Antimagic 導入法

自分は mac chrome 

何も分かってないので何かが壊れても自己責任で

ありがたい元ブログ https://codeforces.com/blog/entry/64131

 

1. ブログ内の Chrome extension と書かれているところを押すと、うまくいかないので、そのリンクの先祖の 

https://github.com/Golovanov399/antimagic に行って、download zip する

 

2. 解凍する

 

3. packed/antimagic.zip も解凍したけどこれは必要か未検証

 

4. background_ff.js とbackground.js の browser と書かれているのを chrome に書き換える(4箇所ずつ)

 

5. chrome://extensions/ に行って、デベロッパーモードをON

 

6. パッケージ化されていない拡張機能を読み込む、を押して、antimagic-master フォルダを選択

 

で出来ました

AGC055-D ABC Ultimatum やや別解

まわりくどいことをしていそうだが人間向けかもしれない

 

問題

atcoder.jp

 

解法

 

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

 

 

S を時計回りに円環にした U を考えます。

このとき、U で時計回りに A,B,C の順になっているものを取れることになります。

これは、A-B のペアを N 組作って、各ペアは U で B -> A (時計回り)の間にある C を使うことができる、と言い換えることができます。

 

次に、C を無視して A と B だけについて考えます。

A を ( , B を ) としたカッコ列 T を考えると、T の累積和の min (タイブレークは左優先)から始まるように rotate することで、valid なカッコ列にできます。

実は、S をその場所で rotate したあとの A の左から i 番目と B の左から i 番目をペアにするのが C の条件を考えた時に最適なことが示せます。

 

以下、そのように S を rotate したあとのことを考えます。

左から i 番目の A の位置を l_i , B の位置を r_i とします。

 

このとき、Hallの定理より、全ての l_j <= r_i となる 1 <= i <= j <= N について、( S で l_j から r_i の間にある C の個数 ) + j - i + 1 <= N が成り立ち、かつ A,B,C が N 個ずつであることが良い文字列であることと同値であることがわかります。

C の個数の累積和配列を rui として整理すると、l_j <= r_i や i <= j は外してよく、

lma = - rui[l_i] + i の max

rma = rui[r_i] - i の max

としたときに lma + rma < N という条件になります。

 

あとは、どこで rotate するか全探索してそれぞれ dp すればトータル O(N^6) で解けます。

 

提出

atcoder.jp

 

 

 




以上の内容はhttps://rubikun.hatenablog.jp/より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14