0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

ユーザ名 hidehico
コンテスト名 HHKBプログラミングコンテスト2025(AtCoder Beginner Contest 388)
順位 2438th / 11601 (top 2.04%)
パフォーマンス 1114
レーティング 840 → 872 (+32) Highest更新!
段級位 6 級

よっしゃー、5完 6ペナ???
えーはいE問題でやらかして6ペナ食ったアホです
ランダムチェッカー使ってやっとEを通しました

コンテストの流れ

開始3秒

acc newを実行し、テストケースを取得する

開始60秒

vimでgolfできそうと思ったけど、普通にAをpythonで通す

開始3分

問題文を読むのに時間がかかったけどBを通す

開始8分

二分探索でCを通す ライブラリ作っといてよかった

開始20分

imos法でDを通す

開始50分

Eのロジックが完成
ここから6ペナが始まる

開始75分

すでに6ペナを食っている
パフォもあまり変らないだろうと思いつつも、ランダムチェッカーを作成した

開始80分

パラメータをイジってやっとEを通す

こんなかんじでした
そんじゃ1問ずつ感想書きますか

使っているライブラリ

github
ファイル分割したんでよかったら、見てください

二分探索ライブラリ

今回の記事で使っているので紹介します

def binary_search(fn: Callable[[int], bool], right: int = 0, left: int = -1) -> int:
    """
    二分探索の抽象的なライブラリ
    評価関数の結果に応じて、二分探索する
    最終的にはleftを出力します

    関数のテンプレート
    def check(mid:int):
        if A[mid] > x:
            return True
        else:
            return False

    midは必須です。それ以外はご自由にどうぞ
    """
    while right - left > 1:
        mid = (left + right) // 2

        if fn(mid):
            left = mid
        else:
            right = mid

    return left

筆者のdotfiles(宣伝)

github
neovimの設定を書きなおしたら、結構プラグインの数が減らせました

A問題

普通に実装した

ACコード(あとで書いた)
escapeが消えてますがご了承

a DaUPCZZ

B問題

全探索しました

ACコード(ライブラリ抜粋)

N, D = il()
L = li(N, il)

for k in range(1, D + 1):
    ans = 0

    for t, l in L:
        ans = max(ans, (l + k) * t)

    print(ans)

C問題

パッと見 にぶたんだと思って実装しました
ライブラリ作っといたので、実装の手間が大幅に軽減しました(オススメです)

ACコード(ライブラリ抜粋)

N = ii()
A = il()
ans = 0

for a in A:

    def c(mi):
        if A[mi] <= a // 2:
            return True
        else:
            return False

    ans += binary_search(c, N, -1)

print(ans)

D問題

imos法を使って実装しました

親に説明しろと言われて、どうしようか迷ってます
まずimos法から解説しないとなので大変

ACコード(ライブラリ抜粋)

N = ii()
A = il()
dp = [0] * (N + 1)
ans = [0] * N
cur = 0

for i in range(N):
    cur += dp[i]
    A[i] += cur

    if i + A[i] + 1 >= N:
        ans[i] = A[i] - (N - i - 1)
        dp[i + 1] += 1
        continue

    if A[i] == 0:
        continue

    dp[i + 1] += 1
    dp[i + A[i] + 1] -= 1

print(*ans)

E問題

二分探索を使って実装しました
上に置くモチは、一番小さいとこからK番目まで、下に置くモチは、$N-K$番目から$N$番目までを、使えばOK
それができるか、できないかを判定関数にして二分探索すればよかった

だけどKの上限と下限の設定をミスって案の定6ペナ食らいました
ランダムチェッカー使ったら一瞬でした

ACコード(ライブラリ抜粋)

N = ii()
A = il()


def c(mid):
    a = A[:mid]
    b = A[N - mid :]

    for i in range(mid):
        if a[i] <= b[i] // 2:
            continue
        else:
            return False

    return True


ans = binary_search(c, N // 2 + 1, -1)
print(ans)

最後に

やはりペナの効果は大きいですね
来週はAHCなので楽しみです。(ていうかABCの結果が心配)

最後まで見ていただいて、ありがとうございます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?