競プロ弱者の解答

競プロ弱者の成長記録

ABC098(バーチャル):水色競プロerの復習

一昨日のABC100、昨日のABC099に続き、今日はABC098でバーチャルコンテストしました。

コンテストの時期的に、これもリアルタイムで参加したはずです。

〇コンテスト名:ABC098

〇配点:不明

〇制限時間100分(A~Dまでの4問の時代のコンテスト)

〇今回の方針

 本番のコンテストのつもりで解く

 とにかく速く解く

コンテスト開始!

A - Add Sub Mul
何も考えず、A+B,A-B,A*Bの最大値を出せば良いですね。

A,B=map(int,input().split())
print(max(A+B,A-B,A*B))

1:00 AC

B - Cut and Count
英小文字からなる文字列が与えられる。どこかで切って、前半にも後半にもある文字の種類数の最大値を出力せよ。
文字で説明は難しいですね。
リストの中に0が26個並んだリストを用意して、aが出たら最後のリストの0番目を+1して加える、cが出たら2番目を+1して加える・・
やっぱりコードを見ていただく方が良さそうです。

N=int(input())
S=list(input())
import copy
A=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
L=[[0 for i in range(26)]]
for i in range(N):
    l=copy.deepcopy(L[-1])
    for j in range(26):
        if S[i]==A[j]:
            l[j]+=1
    L.append(l)

ans=0
for i in range(N):
    cnt=0
    for j in range(26):
        if L[i][j]>0 and L[-1][j]-L[i][j]>0:
            cnt+=1
    if ans<cnt:
        ans=cnt
print(ans)

9:13 AC これB問題とは思えない難易度なんですが。想定解ではなかったのでしょうか?

C - Attention
人が1列に並んでいる。人は東もしくは西を向いている。リーダーを適切に選んだ時、全員をリーダーの方に向かせ(リーダーはどちらを向いていても良い)るのに向きを変える最小の人数を求めよ。
西から順に西を向いている人数の累積和を求める。
同様に東から順に東を向いている人数の累積和を求める。
リーダーの位置を全探索。
で求められますね。
これBより簡単なのでは?

N=int(input())
S=list(input())
RS=S[::-1]
W=[0]
E=[0]
for i in range(N):
    if S[i]=="W":
        W.append(W[-1]+1)
    else:
        W.append(W[-1])
W.append(0)
for i in range(N):
    if RS[i]=="E":
        E.append(E[-1]+1)
    else:
        E.append(E[-1])
E.append(0)
E=E[::-1]
#print(W)
#print(E)
ans=10**9
for i in range(1,N+1):
    if W[i-1]+E[i+1]<ans:
        ans=W[i-1]+E[i+1]
print(ans)

はいフラグ回収!
22行目のN+1が最初Nになっていて1WA
WAの原因を探るためにプリントデバッグして、そのまま19,20行目のコメントアウトを忘れてもう1WA
23:28 2WA

D - Xor Sum 2
連続する区間の合計=区間の全てのXORとなる範囲の数を求めよ。
合計を持って置き、先頭の先を足したもの=先頭の先のXORであれば先頭を伸ばし、合計も増やす。そうでなければ、それまでの先頭と終わりの差を答えに足す。を繰り返す。
これも文章では難しいですが、やっていることは難しくないです。

N=int(input())
A=[0]+list(map(int,input().split()))+[0]
x=[0]
for i in range(1,2*(10**5+3)):
    x.append(x[-1]+i)

S=0
E=0
SUM=0
ans=0
for i in range(10**6):
    if S==N+1:
        ans+=x[(S-E-1)]
        break
    if SUM+A[S+1]==SUM^A[S+1]:
        SUM+=A[S+1]
        S+=1
    else:
        ans+=(S-E)
        SUM-=A[E+1]
        E+=1
    #print(ans,S,E,SUM)
print(ans)

68:02 AC

難しいことをしていないのにバグがとれず、時間がかかってしまいました。
実装力の無さを実感しています。

結局68:02 全完(4完) 2WA


過去のABCによる精進は水色下位には有効そうですね。