2
0

C - Ideal Holidays

問題

考えたこと

周期性があるので何日目にいることを仮定するかは自由です。周期性を考慮した後の日にちに対して最小値を基点として、他の点との距離を求めて休日としていくことが可能か判定していきました。文字だけではわかりずらいので、図で考えていきましょう。以降では入力例2に対して$D$を変えて考えていきます。

図1は距離を求めれば周期性によりスライドすることができ、それにより休日内に収まるか判定できることを表しています。

zu1.png

図2は距離には2種類あることを表していて、こちらも周期性によりスライドをすることができます。距離11のままではすべて平日と判定しまいますが、距離4のほうではすべて休日にすることが可能です。

zu2.png

図3はどちらの距離に対しても最大距離間は全点を網羅するということを表しています。なので、基点から2種類の最大距離、max_dist1, max_dist2をもとめ、これらの小さいほうをスライドさせて休日の範囲内に収まっているか判定すればよいことがわかります。

zu3.png

ACコード

c.py
n, a, b = map(int, input().split())
D = list(map(int, input().split()))
# 周期性を考慮し、日にちを変換。重複を削除
D_set = {d % (a + b) if d % (a + b) != 0 else a + b for d in D}

# 最小の日にちを基点とした
min_d = min(D_set)
D_set.remove(min_d)

max_dist1, max_dist2 = 0, 0
for d in D_set:
    dist = d - min_d
    max_dist1 = max(max_dist1, dist)
    max_dist2 = max(max_dist2, a + b - 1 - dist)

print("Yes" if min(max_dist1, max_dist2) < a else "No")

D - Popcount and XOR

問題

考えたこと

$popcount(X)$と$popcount(Y)$間に差をつけるのは、2進数に変換した$C$が$1$の時のみです。なので、2進数に変換した$C$が$1$の場所をすべて通過した後、$popcount(X)$と$popcount(Y)$は等しくなっており、それぞれ$a$と$b$以下でなければなりません。

条件を確認後、$popcount(X)$と$popcount(Y)$が$a$、$b$に達していない分、$(1, 1)$をつけ足していきます。

ACコード

d.py
a, b, c = map(int, input().split())

bin_c = bin(c)[2:]
n = len(bin_c)
X, Y = ["0" for _ in range(n)], ["0" for _ in range(n)]

for i in range(n):
    if bin_c[i] == "1":
        if a >= b:
            X[i] = "1"
            a -= 1
        else:
            Y[i] = "1"
            b -= 1

if a < 0 or b < 0 or a != b:
    exit(print(-1))

for i in range(n):
    if a == b == 0:
        break
    if bin_c[i] == "0":
        X[i] = "1"
        Y[i] = "1"
        a -= 1
        b -= 1

if 60 - len(X) >= a:
    X = ["1"] * a + X
    Y = ["1"] * a + Y
    print(int("".join(X), 2), int("".join(Y), 2))
else:
    print(-1)

2
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
2
0