TonamiLog

ゆるキャン△とスノーボードとオタク

ABC130(4完)

ハロートナミです……

ABC130に出て13ペナで4完しました。13ペナ。13ペナです
日本語に苦戦しすぎています。

以下ネタバレがあります

A

考え

最近のABCのA極端に簡単すぎませんか?

書いたソース
X,A = map(int, input().split())

if X < A:
    print(0)
else:
    print(10)

B

考え

問題文が難しい。例を見るとすぐ理解できます。
1回目のバウンドが必ずあることに注意します。

書いたソース
N,X = map(int, input().split())
L = [int(x) for x in input().split()]

now = 0
result = 1
for l in L:
    now += l
    if now <= X:
        result += 1

print(result)

C

考え

問題文を一部抜粋します。
f:id:Thiroyuki:20190616222816p:plain
はい。

私は脳みそがダメなので2つの長方形に分割すると勝手に考えてWAを8回出しました。
なんとこの問題、2つの長方形に分割するソースを提出した際通らないテストケースが1つしかないんですよ。
なので、なんかエッジケースに気付けてないのか……?エッジケースって何?みたいになって無限にやってしまいました。ほんまによお

2つに分割するだけなら考える事はほとんどないです。
常に半分に分割する事ができ、x,yが中心である時のみ複数ケースがあります。

書いたソース
W, H, x, y = map(int, input().split())

if x == W/2 and y == H/2:
    print((W*H)/2, 1)
else:
    print((W*H)/2, 0)

やだもー

D

考え

ABCのDってこういうやつだよね!という感じの問題。
まずaのsumと後ろからの累積和を取ります。
そしたら各aに対してそのaから何ケース考えれるかを後ろからの累積和に対する2分探索で計算し
処理が終わったらそのaをsumから引きます。
日本語にするのが難しいんですがソースだと多少わかりやすいかもしれない

書いたソース
import bisect

N,K = map(int, input().split())
alist = [int(x) for x in input().split()]
asum = sum(alist)
reba = [0]*N
x = 0
gyaku = alist[::-1]
for i, a in enumerate(gyaku):
    x += a
    reba[i] = x
result = 0
for a in alist:
    if asum < K:
        break
    result += bisect.bisect_right(reba, asum-K)+1
    asum -= a
print(result)

累積和の取り方が下手すぎる

EとF

EがDPなことはわかり、制約が10^3だったのでなんかこう、相互に頑張るんだなという気持ちになりました。
ソース化すら出来ていません。

結果

f:id:Thiroyuki:20190616223355p:plain
Dは自分にはやや難しい問題だと感じるためWAが出てもよしとする。2分探索無しでTLEしたのは気をつけるべきでした。
BのWAはケアレスミスなので今後は気をつける。
C、日本語の勉強をする。

f:id:Thiroyuki:20190616231101p:plain
一生水色になれない……

いやー本当にCの誤読が辛かった。Cで意味不明なハマり方しなければあと500位は順位高かった気がする。
昨今のABCはDまで解く人がめちゃんこ多くて、Dまでは早解き勝負、Eは解けたら凄いね、みたいな感じになっている印象です。
早解き勝負はプレッシャーがきついし普通に勝ち目も薄く感じるので、Eまで解ける方向に精進をシフトする必要があるかもしれません。
具体的にはDPです。DPを思い通りにかけるようにならないといけない。DPをやりましょう


おわり