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?

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

Posted at

はじめに

投稿遅れてすんません
点数見た時点で荒れると思っていたけどBの問題文がすごい複雑で結局C問題を先に解いてあとでBを解いた
Bの実装が結構重かった(茶色の感想)
初めて自分用ライブラリを導入してみたけど使い心地は良かった
今後も使おうと思う(今言わなくていい)

使っているライブラリ
def pow(x: int, n: int, t: int = 1):
    if t == 1:
        ans = 1
        while n:
            if n % 2:
                ans = ans * x
            x = x * x
            n >>= 1
        return ans
    ans = 1
    while n:
        if n % 2:
            ans = (ans * x) % t
        x = (x * x) % t
        n >>= 1
    return ans


def is_prime(n: int) -> bool:
    if n == 1:
        return False

    i = 2
    s = n**0.5

    while i < s:
        if n % i == 0:
            return False

        i += 1

    return True


INF = 10**18
lowerlist = list("abcdefghijklmnopqrstuvwxyz")
upperlist = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")

それじゃ一問ずつ感想書きますか

A問題

まあ150点ってだけでいつものAと同じ感じだった
最後に押されたときの時間を変数においておいて
あとは問題文の通り実装した
PythonでのACコード

(
    N,
    C,
) = list(map(int, input().split()))
A = list(map(int, input().split()))
r = 1
t = A[0]

for i in A[1:]:
    if i - t >= C:
        r += 1
        t = i

print(r)

解説URL

B問題

最初にも話したように実装がきつかった
そして問題文をところどころ見落とし実装ミスした
制約をすごい見落としよくわからなくなりCへスキップCをACしてからBをACした

PythonでのACコード↓↓(ライブラリ抜粋)
コード全文(2000byteもあります)

N, Q = list(map(int, input().split()))
ans = 0
l = 1
r = 2

for _ in [0] * Q:
    H, T = input().split()
    T = int(T)

    if H == "L":
        tl = l
        c = 0
        mode = False
        while tl != T:
            if mode:
                tl -= 1
                c += 1
            else:
                if tl + 1 == r or (tl == N and r == 1):
                    c = 0
                    tl = l
                    mode = True
                else:
                    tl += 1
                    c += 1

            if c > 0:
                if mode:
                    if tl == 0:
                        tl = N
                else:
                    if tl == N + 1:
                        tl = 1

        l = T
        ans += c
    elif H == "R":

        tr = r
        c = 0
        mode = False
        while tr != T:
            if mode:
                tr -= 1
                c += 1
            else:
                if tr + 1 == l or (tr == N and l == 1):
                    c = 0
                    tr = r
                    mode = True
                else:
                    tr += 1
                    c += 1
            if c > 0:
                if mode:
                    if tr == 0:
                        tr = N
                else:
                    if tr == N + 1:
                        tr = 1

        r = T
        ans += c

print(ans)

解説URL

C問題

AとBどちらもソートして二分探索した
計算量は難解を極める
僕はどちらかというとオブジェクト指向関数型も書けるが競プロ始めてから意識しないと手続き型になってしまい 判定関数も作っていないゴミコードですがよろしければ見てください

PythonによるACコード(ライブラリ抜粋)
全文

import bisect

N = int(input())
A = sorted(list(map(int, input().split())))
B = sorted(list(map(int, input().split())))

r = 0

for i in range(N - 1):
    if A[i] <= B[i]:
        continue
    else:
        r += 1

if r >= 1:
    print(-1)
    exit()

ng, ok = (0, A[-1])

while ok - ng > 1:
    mid = (ng + ok) // 2
    TB = B.copy()
    bisect.insort(TB, mid)
    r = 0
    for a, b in zip(A, TB):
        if a <= b:
            continue
        else:
            r += 1
            break

    if r:
        ng = mid
    else:
        ok = mid

print(ng + 1)

解説URL

D問題

閉路なにそれ状態で結局ACできなかった
BFSの線までは言っていたがそれを1..Nすべて試す方法を思いついたが計算量が$O(N(N+M))$になってしまうため諦めた
最後までACできなかった

解説見たらBFSで頂点1に戻って来るだけで良かったらしい

解説URL

最後に

灰色に戻らなくてよかった
レートは30ぐらい上がりました

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?