1
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?

茶色コーダーによるABC381振り返り

Last updated at Posted at 2024-11-24

はじめに

東京行ってきたんですけど(ABCの翌日)色んなとこ行って、楽しかったです

ほぼ初東京の田舎者の思い出話 全く関係ないので見なくていいです 長野駅から新幹線で、上野まで行ってとりあえず渋谷駅に行った。(軽井沢駅で30分足止め食らった) ハチ公の前で写真取ろうとしたら、外国人がたくさんいて、しょうがないから尻尾のあたりに立って写真撮って、その後スクランブル交差点をわたった。

その後六本木ヒルズに行って、東京の都会ぶりを見渡す
まだ自分が住んでいるとこの標高より低いとはず(六本木ヒルズが)
で秋葉原に行って昼飯食って、VimConfがやってるみたいだから、会場の前で記念撮影した。
誰かしら有名人に会うかなーと思っていたんですけど、そんなはずはなく、誰にも会いませんでした
その後、秋葉原を散策して、でっかいヨドバシカメラに行って、HHKBを探したけどなかった

その後丸ノ内線乗って、国会議事堂前で写真取った一応、議事堂一周した。
で東京駅に行って、東京駅と皇居を外側から見渡す(東京から皇居まで往復1.2キロ)
そしてまた丸ノ内線乗って(丸ノ内線4回乗りましたw)西新宿に行って 都庁を見る(結構歩いた)
そして新宿駅まで歩いて、新宿駅の小田急で鳩サブレを買い
そして中央線に乗って東京に戻ってスタバで休憩して駅弁買って、帰りの新幹線の中で食べました(新宿駅の人混みがすごかった)

皆さん都会に、疲れたら田舎に来て休息しに来てください
長野県では冬ウィンタースポーツが盛んです。寒いですがぜひ来てください(寒いときは-10度行きます)

宣伝するな

やったー3完だけで緑perf、レート上がったラッキー(楽観的)
なんかABの実装に手こずり時間ロスして、Cはいい感じの解法が思いついたので、それをしたらACした
Dは尺取り法だってわかってたけど、実装ミスって最後までACできなかったです
さて本題

使っているライブラリ 前回から変えてません 参考にどうぞ
github

A問題

問題文を要約
前半が1で、真ん中の文字が/で、後半の文字が2だと判定してくださいという問題

C問題と同じ趣旨らしい
普通に実装したけど、少し時間がかかった

acコード(ライブラリ抜粋) 全文
クソコードです 参考にしないでください

N = ii()
S = s()

c = 0

for i in range(N):
    if S[i] == "1":
        c += 1
    else:
        break

if S[c] != "/":
    print("No")
    exit()

a = 0

for i in range(c + 1, N):
    if S[i] == "2":
        a += 1
    else:
        break

if c == a and c + a + 1 == N:
    print("Yes")
else:
    print('No')

B問題

問題文を要約...するのがめんどくさい

D問題と趣旨は似ていた

普通に実装してACした

acコード(ライブラリ抜粋) 全文

S = s()
if len(S) % 2 != 0:
    print("No")
    exit()

D = defaultdict(int)

for s in S:
    D[s] += 1

for i in D.values():
    if i == 0 or i == 2:
        continue
    else:
        print("No")
        exit()

i = 1

while i <= len(S) // 2:
    if S[(2 * i) - 2] == S[(2 * i) - 1]:
        pass
    else:
        print("No")
        exit()
    i += 1

print("Yes")

C問題

問題文を要約
$S$の中からA問題の文字列の条件を満たす。最大の部分文字列の長さを求めてください

普通にやると$O(N^2)$でTLEするので、/を見つけたら左右に条件を満たさなくなるまで、左右を広げ続ければいい
そしてansを更新
すればいい
計算量は$O(N)$です

acコード(ライブラリ抜粋) 全文

N = ii()
S = s()

ans = 1

for i in range(N):
    if S[i] != "/":
        continue

    a, b = i - 1, i + 1

    while 0 <= a and b < N:
        if S[a] == "1" and S[b] == "2":
            a -= 1
            b += 1
        else:
            break

    if a == i - 1 and b == i + 1:
        continue
    ans = max(ans, (i - a) * 2 - 1)

print(ans)

D問題

問題文を要約
$A$の中からB問題の条件を満たす、最大の部分列の長さを求めてください

尺取り法までは行けたけど、色々ミスって結局ACできなかった

後日尺取り法で書いたらACした

after-contest caseが大量に作成されていて笑った

最後に

レートは30ぐらい上がった。
やっと茶色上位勢になった

4完していたらもうちょっとperfが出ていたな、と思うとDの目の付け所を間違えた

1
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
1
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?