LoginSignup
0
0

More than 1 year has passed since last update.

ABC261~270『 AtCoder ABC251~275 ARC140~151 灰・茶・緑問題 超詳細解説』コピペ用コード

Last updated at Posted at 2023-01-04

ABC251~260
https://qiita.com/sano192/items/0e5c5fc9ce9ac973c2b8

ABC271~275,ARC140~151,UnionFind,FenwickTree
https://qiita.com/sano192/items/a2b11bd960ccffffa8ea

ABC261 A

# 入力の受け取り
L1,R1,L2,R2=map(int,input().split())
 
# L1,L2のうち大きい方
Lmax=max(L1, L2)
# R1,R2のうち小さい方
Rmin=min(R1, R2)
 
# (Rmin-Lmax)がマイナスなら
if Rmin-Lmax<0:
    # 0を出力
    print(0)
# そうでなければ
else:
    # (Rmin-Lmax)を出力
    print(Rmin-Lmax)
# 入力の受け取り
L1,R1,L2,R2=map(int,input().split())
 
# 0か(R1,R2のうち小さい方)-(L1,L2のうち大きい方) の大きい方
print(max(0,min(R1,R2)-max(L1,L2)))

ABC261 B

# 入力の受け取り
N=int(input())
 
# 表
A=[]
 
# N回
for i in range(N):
    # 入力の受け取り
    S=input()
    # 一文字ずつリストへ展開
    Slist=list(S)
    # Tableへ追加
    A.append(Slist)
 
# i=0~(N-1)
for i in range(N):
    # j=0~(N-1)
    for j in range(N):
 
        # i=jの場合
        if i==j:
            # 次のjへ
            continue
 
        # A[i][j]="W" かつ A[j][i]≠"L" の場合
        if A[i][j]=="W" and A[j][i]!="L":
            # 「incorret」を出力
            print("incorrect")
            # 終了
            exit()
        # A[i][j]="L" かつ A[j][i]≠"W" の場合
        if A[i][j]=="L" and A[j][i]!="W":
            # 「incorret」を出力
            print("incorrect")
            # 終了
            exit()
        # A[i][j]="D" かつ A[j][i]≠"D" の場合
        if A[i][j]=="D" and A[j][i]!="D":
            # 「incorret」を出力
            print("incorrect")
            # 終了
            exit()
 
# 「correct」を出力
print("correct")

ABC261 C

# 入力の受け取り
N=int(input())
 
# defaultdictをインポート
from collections import defaultdict
 
# Sの出現回数を記録する連想配列
SCount=defaultdict(int)
 
# N回
for i in range(N):
    # 入力の受け取り
    S=input()
 
    # Sの出現回数が0回ならば
    if SCount[S]==0:
        # 何もつけずに出力
        print(S)
    # Sの出現回数が1回以上ならば
    else:
        # 出現回数とかっこをつけて出力
        print(S+"("+str(SCount[S])+")")
    # 出現回数をプラス1
    SCount[S]+=1

ABC261 D

# pypyで提出
 
# 入力の受け取り
N,M=map(int,input().split())
# X[0]はてきとうな値で埋めておく
X=[0]+list(map(int,input().split()))
# ボーナスの値(ボーナスない箇所は0)
B=[0]*(N+1)
 
# M回
for i in range(M):
    # 入力の受け取り
    C,Y=map(int,input().split())
    # カウンタCでY円ボーナス
    B[C]=Y
 
# (1)表を作る
# 「i回目までのコイントスを行い、カウンタの値がkである場合の(i回目までの)最大金額」
dp=[[0]*(N+1) for i in range(N+1)]
 
# i=1~N
for i in range(1,N+1):
    # k=0~i
    for k in range(i+1):
        # k=0の場合
        if k==0:
            dp[i][k]=max(dp[i-1])
        # 1≤kの場合
        else:
            dp[i][k]=dp[i-1][k-1]+X[i]+B[k]
 
# 答え:N行目の最大値
print(max(dp[N]))

ABC262 A

# 入力の受け取り
Y=int(input())
 
# Yを4で割った余りが2なら
if Y%4==2:
    # Yを出力
    print(Y)
# (Y+1)を4で割った余りが2なら
elif (Y+1)%4==2:
    # (Y+1)を出力
    print(Y+1)
# (Y+2)を4で割った余りが2なら
elif (Y+2)%4==2:
    # (Y+2)を出力
    print(Y+2)
# (Y+3)を4で割った余りが2なら
elif (Y+3)%4==2:
    # (Y+3)を出力
    print(Y+3)
# 入力の受け取り
Y=int(input())
 
# 答えの出力
print(Y+(2-Y%4)%4)

ABC262 B

# 入力の受け取り
N,M=map(int,input().split())
 
# つながっている頂点を記録する二次元配列
# 最初は全ての初期値をFalseにする
connect=[[False]*(N+1) for i in range(N+1)]
 
# M回
for i in range(M):
    # 入力の受け取り
    U,V=map(int,input().split())
    # 頂点Uと頂点Vがつながっている⇔Trueと記録
    connect[U][V]=True
    connect[V][U]=True
 
# 答え
ans=0
 
# a=1~N
for a in range(1,N+1):
    # b=(a+1)~N
    for b in range(a+1,N+1):
        # c=(b+1)~N
        for c in range(b+1,N+1):
            # a,b,cが全てつながっていれば
            if connect[a][b]==True and connect[b][c]==True and connect[c][a]==True:
                # 答えにプラス1
                ans+=1
 
# 答えの出力
print(ans)

ABC262 C

# 入力の受け取り
N=int(input())
# a[0]を適当な数(=0)で埋めておく
a=[0]+list(map(int,input().split()))
 
# 答え
ans=0
 
# ・ai=i,aj=j
# ax=xとなっているものの個数
k=0
 
# i=1~N
for i in range(1,N+1):
    # a[i]=iならば
    if a[i]==i:
        # kにカウント
        k+=1
 
# kC2=(k*(k-1)//2)個
ans+=k*(k-1)//2
 
# ・ai=j,aj=i
# i=1~N
for i in range(1,N+1):
    # a[i]=j
    j=a[i]
    # i<j かつ a[j]=iならば
    if i<j and  a[j]==i:
        # 答えにカウント
        ans+=1
 
# 答えの出力
print(ans)

ABC263 A

# 入力の受け取り
Card=list(map(int,input().split()))
 
# 小さい順に並び替え
Card.sort()
 
# 0枚目と1枚目が同じ かつ 2枚目と3枚目と4枚目が同じ
if Card[0]==Card[1] and Card[2]==Card[3]==Card[4]:
    # 「Yes」を出力
    print("Yes")
# 0枚目と1枚目と2枚目が同じ かつ 3枚目と4枚目が同じ
elif Card[0]==Card[1]==Card[2] and Card[3]==Card[4]:
    # 「Yes」を出力
    print("Yes")
# どちらでもない
else:
    # 「No」を出力
    print("No")

ABC263 B

# 入力の受け取り
N=int(input())
# P[0]とP[1]をてきとうな値で埋める
P=[0]+[0]+list(map(int,input().split()))
 
# 世代を遡った回数
Count=1
 
# 人Nから辿っていく
i=N
# 人1にたどり着くまで
while P[i]!=1:
    # 回数のカウント
    Count+=1
    # P[i]の親へ
    i=P[i]
 
# 遡った回数を出力
print(Count)

ABC263 C

# 入力の受け取り
N,M=map(int,input().split())
 
# itertoolsのインポート
import itertools
# 重複なしの組み合わせ
# (1,2,3),(1,2,4),---,(7,8,9)
for p in itertools.combinations(range(1,M+1),N):
    # 答えの出力(*をつけると[]なしで出力できる)
    print(*p)

ABC263 D

# 入力の受け取り
N,L,R=map(int,input().split())
A=list(map(int,input().split()))
 
# fの計算
# A[0]を埋める
A=[0]+A
# fを作る(f(0)=0)
f=[0]*(N+1)
 
# i=1~N
for i in range(1,N+1):
    # fの計算
    f[i]=min(f[i-1]+A[i],L*i)
 
# Aをひっくり返す
A=A[::-1]
# A[0]を埋める
A=[0]+A
 
# gを作る(g(0)=0)
g=[0]*(N+1)
 
# i=1~N
for i in range(1,N+1):
    # fの計算
    g[i]=min(g[i-1]+A[i],R*i)
 
# 答え
ans=10**15
# i=1~N
for i in range(N+1):
    # これまでの答えとf[i]+g[N-i]の小さい方で更新
    ans=min(ans,f[i]+g[N-i])
 
# 答えの出力
print(ans)

ABC264 A

# 入力の受け取り
L,R=map(int,input().split())
 
# 「atcoder」をSへ格納
S="atcoder"
 
# (L-1)~(R-1)番目を出力
print(S[L-1:R])

ABC264 B

# 入力の受け取り
R,C=map(int,input().split())
# マス目を作る
# 最初は全てのマスが0
Grid=[[0]*16 for i in range(16)]
 
# i=1~15
for i in range(1,16):
    # 1行i列=1
    Grid[1][i]=1
    # 15行i列=1
    Grid[15][i]=1
    # i行1列=1
    Grid[i][1]=1
    # i行15列=1
    Grid[i][15]=1
 
# i=3~13
for i in range(3,14):
    Grid[3][i]=1
    Grid[13][i]=1
    Grid[i][3]=1
    Grid[i][13]=1
 
# i=5~11
for i in range(5,12):
    Grid[5][i]=1
    Grid[11][i]=1
    Grid[i][5]=1
    Grid[i][11]=1
 
# i=7~9
for i in range(7,10):
    Grid[7][i]=1
    Grid[9][i]=1
    Grid[i][7]=1
    Grid[i][9]=1
 
# R行C列が1ならば
if Grid[R][C]==1:
    # 「black」を出力
    print("black")
# R行C列が0ならば
else:
    # 「white」を出力
    print("white")

ABC264 C

# pypyで提出
 
# 入力の受け取り
H1,W1=map(int,input().split())
A=[]
 
# i=0~(H1-1)
for i in range(H1):
    # リストとして受け取り
    tmp=list(map(int,input().split()))
    # Aに追加
    A.append(tmp)
 
# 入力の受け取り
H2,W2=map(int,input().split())
B=[]
 
# i=0~(H2-1)
for i in range(H2):
    # リストとして受け取り
    tmp=list(map(int,input().split()))
    # Bに追加
    B.append(tmp)
 
# 行の2進数を作る(GyouBit=Gb)
for Gb in range(1<<H1):
    # 列の2進数を作る(RetuBit=Rb)
    for Rb in range(1<<W1):
        # 空の配列(Aremove)を作る
        Aremove=[]
 
        # i=0~(H1-1)
        for i in range(H1):
            # 0行目、1行目、...について、Gbの0桁目、1桁目を見て残す行か確認
            # ⇔Gbの右からi桁目と1をアンド演算して1なら残す
            if Gb>>i & 1 ==1:
 
                # (残す行なら)空の配列(Retu)を作る
                Retu=[]
 
                # k=0~(W1-1)
                for k in range(W1):
                    # 0列目、1列目、...について、Rbの0桁目、1桁目を見て残す行か確認
                    # ⇔Rbの右からi桁目と1をアンド演算して1なら残す
                    if Rb>>k & 1 ==1:
                        # 残す列なら要素をRetuへ追加
                        Retu.append(A[i][k])
 
                # RetuをAremoveへ追加
                Aremove.append(Retu)
                       
        # 操作後のAとBが一致したら
        if Aremove==B:
            # 「Yes」を出力
            print("Yes")
            # 途中終了
            exit()
 
# 「No」を出力
print("No")

ABC264 D

# 入力の受け取り
S=input()
# 「atcoder」をTに格納
T="atcoder"
 
# 1文字ずつリストへ展開
Slist=list(S)
 
# 答え
ans=0
 
# i=0~6
for i in range(7):
    # Tのi文字目がSlistの何番目か確認
    indx=Slist.index(T[i])
 
    # indxがiでない(正しい位置に来ていない)間
    while indx!=i:
        # indx番目と(indx-1)番目を入れ替え
        Slist[indx],Slist[indx-1]=Slist[indx-1],Slist[indx]
        # 次の文字へ
        indx-=1
        # 操作回数をカウント
        ans+=1
 
# 答えの出力
print(ans)

ABC265 A

# 入力の受け取り
X,Y,N=map(int,input().split())
 
# 1個ずつ買う場合
A=X*N
# 3個セットで買う場合
B=(N//3)*Y+(N%3)*X
 
# A,Bの小さい方が答え
print(min(A,B))

ABC265 B

# 入力の受け取り
N,M,T=map(int,input().split())
# A[0]を埋めるために適当な数字(0)を入れておく
A=[0]+list(map(int,input().split()))
 
# ボーナス部屋で増加する時間の記録リスト
Bonus=[0]*(N+1)
# M回
for i in range(M):
    # 入力の受け取り
    X,Y=map(int,input().split())
    # 部屋XでY増える
    Bonus[X]=Y
 
# i=1~(N-1)
for i in range(1,N):
    # 部屋(i+1)へ移動するためにA[i]時間消費する
    T-=A[i]
 
    # Tが0以下になったら
    if T<=0:
        # 「No」を出力
        print("No")
        # 終了
        exit()
       
    # (i+1)番目の部屋で増加する時間
    T+=Bonus[i+1]
 
# 「Yes」を出力
print("Yes")

ABC265 C

# 入力の受け取り
H,W=map(int,input().split())
 
# グリッド
G=[]
# H回
for i in range(H):
    # 入力の受け取り
    S=input()
    # 1文字ずつリストへ展開
    S=list(S)
    # グリッドに追加
    G.append(S)
 
# 通ったマスを記録する二次元配列
# 初期値は0
# 通ったマスは1にしていく
visited=[[0]*W for i in range(H)]
 
# 今の行(G)、列(R)
NowG,NowR=0,0
 
# 10^10回(大きな数なら何でもOK)
for i in range(10**10):
 
    # 今いるマスが訪問済みならば
    if visited[NowG][NowR]==1:
        # 「-1」を出力
        print(-1)
        # 終了
        exit()
 
    # 今いるマスを訪問済みにする
    visited[NowG][NowR]=1
 
    # 今いるマスが「U」ならば
    if G[NowG][NowR]=="U":
        # 今いるマスの行番号が1以上ならば(上に進んでも壁でないなら)
        if 1<=NowG:
            # 上に進む⇔行をマイナス1
            NowG-=1
        # そうでなければ(上マスが壁)
        else:
            # 今いるマスの座標を出力(1個ずれるので+1することに注意)
            print(NowG+1,NowR+1)
            # 終了
            exit()
   
    # 今いるマスが「R」ならば
    elif G[NowG][NowR]=="R":
        # 今いるマスの列番号が(W-2)以下ならば(右に進んでも壁でないなら)
        if NowR<=W-2:
            # 右に進む⇔列をプラス1
            NowR+=1
        else:
            # 今いるマスの座標を出力(1個ずれるので+1することに注意)
            print(NowG+1,NowR+1)
            # 終了
            exit()
 
    # 今いるマスが「D」ならば
    elif G[NowG][NowR]=="D":
        # 今いるマスの行番号が(H-2)以下ならば(下に進んでも壁でないなら)
        if NowG<=H-2:
            # 下に進む⇔行をプラス1
            NowG+=1
        else:
            # 今いるマスの座標を出力(1個ずれるので+1することに注意)
            print(NowG+1,NowR+1)
            # 終了
            exit()
 
    # 今いるマスが「L」ならば
    elif G[NowG][NowR]=="L":
        # 今いるマスの列番号が1以上ならば(左に進んでも壁でないなら)
        if 1<=NowR:
            # 左に進む⇔列をマイナス1
            NowR-=1
        else:
            # 今いるマスの座標を出力(1個ずれるので+1することに注意)
            print(NowG+1,NowR+1)
            # 終了
            exit()

ABC265 D

# 入力の受け取り
N,P,Q,R=map(int,input().split())
A=list(map(int,input().split()))
 
# 区間和=Pとなる区間のリスト
Plist=[]
# 区間和(初期値はA[0])
S=A[0]
 
# (1)左端=l、右端=rを0とする
# 区間の右
r=0
# l(区間の左)=0~(N-1)
for l in range(N):
 
    # (2)A[l]~A[r]について区間和を計算する
    # r<Nの間
    while r<N:
        # ・区間和がP未満ならば
        if S<P:
            # 右端=rを進める(+1する)
            r+=1
            # 右端を超えたら
            if r==N:
                # 終了
                break
            # A[r]を足す
            S+=A[r]
        # ・区間和がP以上
        else:
            # ・区間和がPならば区間を記録する
            if S==P:
                # 区間を記録
                Plist.append([l,r])
            # 左端=lを進める(+1する)
            break
   
    # 左を進めるのでマイナス
    S-=A[l]
 
 
# 区間和=Qとなる区間のリスト
Qlist=[]
 
# Plistと同様に作る
S=A[0]
r=0
for l in range(N):
    while r<N:
        if S<Q:
            r+=1
            if r==N:
                break
            S+=A[r]
        else:
            if S==Q:
                Qlist.append([l,r])
            break    
    S-=A[l]
 
# 区間和=Rとなる区間のリスト
Rlist=[]
 
# Plistと同様に作る
S=A[0]
r=0
for l in range(N):
    while r<N:
        if S<R:
            r+=1
            if r==N:
                break
            S+=A[r]
        else:
            if S==R:
                Rlist.append([l,r])
            break    
    S-=A[l]
 
# Plist,Qlist,Rlistのどれかが空なら
if len(Plist)==0 or len(Qlist)==0 or len(Rlist)==0:
    # 「No」を出力
    print("No")
    # 終了
    exit()
 
# Qlistのi2番目を確認
i2=0
# Qlistのi3番目を確認
i3=0
 
# i1=0~(Plistの長さ-1)
for i1 in range(len(Plist)):
    # Plistのi1番目の区間の右
    Pr=Plist[i1][1]
    # Qlistのi2番目の区間の左
    Ql=Qlist[i2][0]
 
    # 「Qlistの区間の左」<「Plistの区間の右」+1である間
    while Ql<Pr+1:
        # Qlistの次の区間へ進む
        i2+=1
        # i2がQlistの長さを超えたら
        if i2==len(Qlist):
            # 「No」を出力
            print("No")
            # 終了
            exit()
        # Qlistのi2番目の区間の左
        Ql=Qlist[i2][0]
 
    # 「Qlistの区間の左」<「Plistの区間の右」+1になったら
    if Ql==Pr+1:
        # Qlistのi2番目の区間の右
        Qr=Qlist[i2][1]
        # Rlistのi3番目の区間の左
        Rl=Rlist[i3][0]
 
        # 「Rlistの区間の左」<「Qlistの区間の右」+1である間
        while Rl<Qr+1:
            # Rlistの次の区間へ進む
            i3+=1
            # i2がRlistの長さを超えたら
            if i3==len(Rlist):
                # 「No」を出力
                print("No")
                # 終了
                exit()
            # Rlistのi3番目の区間の左
            Rl=Rlist[i3][0]
       
        # 「Rlistの区間の左」<「Qlistの区間の右」+1になったら
        if Rl==Qr+1:
            # 「Yes」を出力
            print("Yes")
            # 終了
            exit()
 
# 「No」を出力
print("No")

ABC266 A

# 入力の受け取り
S=input()
 
# (Sの文字数)を2で割った商
X=len(S)//2
 
# SのX文字目を出力
print(S[X])

ABC266 B

# 入力の受け取り
N=int(input())
 
# 998244353で割った余りを出力
print(N%998244353)

ABC266 C

# 入力の受け取り
A=list(map(int,input().split()))
B=list(map(int,input().split()))
C=list(map(int,input().split()))
D=list(map(int,input().split()))
 
#点abのベクトル
def vec(a,b):
    # ベクトルを返す
    return (a[0]-b[0],a[1]-b[1])
 
#三角形abcの内部に点pがあるか確認する
# 内部ならTrueを返す
def InTrianble(a,b,c,p):
 
    # それぞれのベクトルを計算
    ab=vec(b,a)
    bp=vec(p,b)
 
    bc=vec(c,b)
    cp=vec(p,c)
 
    ca=vec(a,c)
    ap=vec(p,a)
 
    #外積(Outer Product)を求める
    OP1=ab[0]*bp[1]-ab[1]*bp[0]
    OP2=bc[0]*cp[1]-bc[1]*cp[0]
    OP3=ca[0]*ap[1]-ca[1]*ap[0]
 
    #外積の向き 正負がそろっていれば内側
    if (OP1>0 and OP2>0 and OP3>0) or (OP1<0 and OP2<0 and OP3<0):
        return True
 
# 三角形ABCの内側にDがあるか?
# 三角形BCDの内側にAがあるか?
# 三角形CDAの内側にBがあるか?
# 三角形DABの内側にCがあるか?
if InTrianble(A,B,C,D)==True or InTrianble(B,C,D,A)==True or InTrianble(C,D,A,B)==True or InTrianble(D,A,B,C)==True:
    # 「No」を出力
    print("No")
# 上記全て成り立たない
else:
    # 「Yes」を出力
    print("Yes")

ABC266 D

# 入力の受け取り
N=int(input())
 
# すぬけ君の現れる時刻、座標と大きさを記録する
Size=[[0]*5 for i in range(10**5+1)]
 
# N回
for i in range(N):
    # 入力の受け取り
    T,X,A=map(int,input().split())
    # T秒時点で座標Xに大きさAのすぬけ君が出ると記録
    Size[T][X]=A
 
# (1)表を作る
# (2)すぐにわかるところを埋める
dp=[[0]*5 for i in range(10**5+1)]
 
# (3)表の小さい方から答えにたどり着くまで埋める
# t=1~10^5
for t in range(1,10**5+1):
    # 左上、上、右上のうち一番大きいものを埋める
    dp[t][0]=max(dp[t-1][0],dp[t-1][1])
    dp[t][1]=max(dp[t-1][0],dp[t-1][1],dp[t-1][2])
    dp[t][2]=max(dp[t-1][1],dp[t-1][2],dp[t-1][3])
    dp[t][3]=max(dp[t-1][2],dp[t-1][3],dp[t-1][4])
    dp[t][4]=max(dp[t-1][3],dp[t-1][4])
 
    # x=0~4
    for x in range(5):
        # x≤tならば(時刻tに座標xへ到達できるなら)
        if x<=t:
            # すぬけ君を捕まえる
            dp[t][x]+=Size[t][x]
 
# (4)答えを出力する
# 10**5行の最大値を出力
print(max(dp[10**5]))

ABC267 A

# 入力の受け取り
S=input()
 
# S=「Monday」ならば
if S=="Monday":
    # 5を出力
    print(5)
# S=「Tuesday」ならば
elif S=="Tuesday":
    # 4を出力
    print(4)
# S=「Wednesday」ならば
elif S=="Wednesday":
    # 3を出力
    print(3)
# S=「Thursday」ならば
elif S=="Thursday":
    # 2を出力
    print(2)
# S=「Friday」ならば
elif S=="Friday":
    # 1を出力
    print(1)

ABC267 B

# 入力の受け取り
# 0文字目を「?」で埋める
S="?"+input()
 
# ピン1が倒れていなければ
if S[1]=="1":
    # 「No」を出力
    print("No")
    # 終了
    exit()
 
# どの列が倒れているかを確認
T=""
 
# ピン7が倒れていなければ⇔S[7]=「1」ならば
if S[7]=="1":
    # Tの末尾に「A」を追加
    T+="A"
# それ以外(ピン7が倒れていれば⇔S[7]=「0」ならば)
else:
    # Tの末尾に「B」を追加
    T+="B"
 
# ピン4が倒れていなければ⇔S[4]=「1」ならば
if S[4]=="1":
    # Tの末尾に「A」を追加
    T+="A"
# それ以外(ピン4が倒れていれば⇔S[4]=「0」ならば)
else:
    # Tの末尾に「B」を追加
    T+="B"
 
# ピン2 または ピン8が倒れていなければ⇔S[2]=「1」 or S[8]=「1」ならば
if S[2]=="1" or S[8]=="1":
    # Tの末尾に「A」を追加
    T+="A"
# それ以外(ピン2とピン8両方が倒れていれば⇔S[2]=「1」 and S[8]=「1」ならば)
else:
    # Tの末尾に「B」を追加
    T+="B"
 
# ピン5が倒れていなければ⇔S[5]=「1」ならば
if S[5]=="1":
    # Tの末尾に「A」を追加
    T+="A"
# それ以外(ピン5が倒れていれば⇔S[5]=「0」ならば)
else:
    # Tの末尾に「B」を追加
    T+="B"
 
# ピン3 または ピン9が倒れていなければ⇔S[3]=「1」 or S[9]=「1」ならば
if S[3]=="1" or S[9]=="1":
    # Tの末尾に「A」を追加
    T+="A"
# それ以外(ピン3とピン9両方が倒れていれば⇔S[3]=「1」 and S[9]=「1」ならば)
else:
    # Tの末尾に「B」を追加
    T+="B"
 
# ピン6が倒れていなければ⇔S[6]=「1」ならば
if S[6]=="1":
    # Tの末尾に「A」を追加
    T+="A"
# それ以外(ピン6が倒れていれば⇔S[6]=「0」ならば)
else:
    # Tの末尾に「B」を追加
    T+="B"
 
# ピン10が倒れていなければ⇔S[10]=「1」ならば
if S[10]=="1":
    # Tの末尾に「A」を追加
    T+="A"
# それ以外(ピン10が倒れていれば⇔S[10]=「0」ならば)
else:
    # Tの末尾に「B」を追加
    T+="B"
 
# 「ABA」がTにあれば
if "ABA" in T:
    # 「Yes」を出力
    print("Yes")
# 「ABBA」がTにあれば
elif "ABBA" in T:
    # 「Yes」を出力
    print("Yes")
# 「ABBBA」がTにあれば
elif "ABBBA" in T:
    # 「Yes」を出力
    print("Yes")
# 「ABBBBA」がTにあれば
elif "ABBBBA" in T:
    # 「Yes」を出力
    print("Yes")
# 「ABBBBBA」がTにあれば
elif "ABBBBBA" in T:
    # 「Yes」を出力
    print("Yes")
# それ以外
else:
    # 「No」を出力
    print("No")

ABC267 C

# 入力の受け取り
N,M=map(int,input().split())
# 0番目を[0]などてきとうな数で埋める
A=[0]+list(map(int,input().split()))
 
# 答え
ans=0
 
# i=1~M
for i in range(1,M+1):
    # i*A[i]を足す
    ans+=i*A[i]
 
# 累積和の計算
ACum=[0]*(N+1)
# i=1~N
for i in range(1,N+1):
    # 計算する
    ACum[i]=ACum[i-1]+A[i]
 
# S:「B1=Ai(B:Ai A(i+1) A(i+2) ... A(i+M-1)の場合」のΣi*Biの値
S=ans
 
# i=2~(N-M+1)
for i in range(2,N-M+2):
    # 「B1=Ai(B:Ai A(i+1) A(i+2) ... A(i+M-1))の場合」=「B1=A(i-1)(B:A(i-1) Ai A(i+1) ... A(i+M-2))の場合」-(「A(i-1)~A(i+M-2)の和」)+A(i+M-1)*M
    S=S-(ACum[i+M-2]-ACum[i-2])+A[i+M-1]*M
    # それまでの答えより大きければ更新
    ans=max(ans,S)
 
# 答えの出力
print(ans)

ABC267 D

# 入力の受け取り
N,M=map(int,input().split())
A=[0]+list(map(int,input().split()))
 
# (1)表を作る
dp=[[-10**15]*(N+1) for i in range(M+1)]
 
# (2)すぐにわかるところを埋める
# x=1~N
for x in range(1,N+1):
    dp[1][x]=A[x]
 
# (3)表の小さい方から答えにたどり着くまで埋める
# k=2~M
for k in range(2,M+1):
    # (k-1)行目の最大値
    dpMax=dp[k-1][0]
    # x=k~N
    for x in range(k,N+1):
        # (k-1)行目の最大値 dp[k-1][x-1]がそれまでの最大値より大きければ更新
        dpMax=max(dp[k-1][x-1],dpMax)
        # (2≤k,k≤x)dp[i][x]=「「(k-1)行目,(1~(x-1))列の最大値」+k*Ax
        dp[k][x]=dpMax+k*A[x]
 
# (4)答えを出力する
# M行目の最大値
print(max(dp[M]))

ABC268 A

# 入力の受け取り
A,B,C,D,E=map(int,input().split())
 
# 重複のない整数をカウント
count=1
 
# BとAが違うなら
if B!=A:
    # カウントにプラス1
    count+=1
# CとA,Bが違うなら
if C!=A and C!=B:
    # カウントにプラス1
    count+=1
# DとA,B,Cが違うなら
if D!=A and D!=B and D!=C:
    # カウントにプラス1
    count+=1
# EとA,B,C,Dが違うなら
if E!=A and E!=B and E!=C and E!=D:
    # カウントにプラス1
    count+=1
   
# カウントの値を出力
print(count)
# リストで受け取り
x=list(map(int,input().split()))
 
# セットへ変換
x=set(x)
 
# 長さを出力
print(len(x))

ABC268 B

# 入力の受け取り
S=input()
T=input()
 
# S=Tの先頭から(Sの長さ) ならば
if S==T[0:len(S)]:
    # 「Yes」を出力
    print("Yes")
# そうでなければ
else:
    # 「No」を出力
    print("No")

ABC268 C

# 入力の受け取り
N=int(input())
p=list(map(int,input().split()))
 
# 料理の場所を記録
indx=[0]*N
 
# i=0~(N-1)
for i in range(N):
    # 料理piは位置iにある
    indx[p[i]]=i
 
# 距離
dist=[0]*N
 
# i=0~(N-1)
for i in range(N):
    # 距離を計算
    dist[i]=(i-indx[i])%N
 
# 距離ごとの料理の個数
count=[0]*N
 
# i=0~(N-1)
for i in range(N):
    # 距離iの料理の個数をカウント
    count[dist[i]]+=1
 
# 答え
ans=0
 
# i=1~N
for i in range(N):
    # 距離(0,1,2)の料理の個数合計を計算(1回転によって距離(N-1,0,1)にできる)
    # 距離(1,2,3)の料理の個数合計を計算(2回転によって距離(N-1,0,1)にできる)
    # 距離(2,3,4)の料理の個数合計を計算(3回転によって距離(N-1,0,1)にできる)
    # ...
    # 距離(N-2,N-1,0)の料理の個数合計を計算((N-1)回転によって距離(N-1,0,1)にできる)
    # 距離(N-1,0,1)の料理の個数合計を計算
    # そこまでの答えより大きければ更新
    ans=max(ans,count[i]+count[(i+1)%N]+count[(i+2)%N])
 
# 答えの出力
print(ans)

ABC269 A

# 入力の受け取り
a,b,c,d=map(int,input().split())
 
# (a+b)*(c-d)を出力
print((a+b)*(c-d))
 
# 「Takahashi」を出力
print("Takahashi")

ABC269 B

# 入力の受け取りリスト
Slist=[]
 
# 10回
for i in range(10):
    # 入力の受け取り
    S=input()
    # リストへ追加
    Slist.append(S)
 
# A=0~9
for A in range(10):
    # B=A~9
    for B in range(A,10):
        # C=0~9
        for C in range(10):
            # D=C~9
            for D in range(C,10):
                # 条件を満たしている間True
                OK=True
 
                # i=0~9
                for i in range(10):
                    # j=0~9
                    for j in range(10):
                        # A≤i≤B かつ C≤j≤D の場合
                        if A<=i<=B and C<=j<=D:
                            # Siのj文字目が「.」ならば
                            if Slist[i][j]==".":
                                # 条件を満たさない
                                OK=False
                       
                        # そうでなければ
                        else:
                            # Siのj文字目が「#」ならば
                            if Slist[i][j]=="#":
                                # 条件を満たさない
                                OK=False
 
                # 条件を満たしていれば
                if OK==True:
                    # 答えの出力
                    print(A+1,B+1)
                    print(C+1,D+1)
                    # 終了
                    exit()
# 初期値
A,B=10,1
C,D=10,1
 
# i=0~9
for i in range(10):
    # 入力の受け取り
    S=input()
    # Sに"#"が含まれていれば
    if "#" in S:
        # A,Bを更新
        A=min(A,i+1)
        B=max(B,i+1)
        # j=0~9
        for j in range(10):
            # Sのj文字目が"#"ならば
            if S[j]=="#":
                # C,Dを更新
                C=min(C,j+1)
                D=max(D,j+1)
 
# 答えを出力
print(A,B)
print(C,D)

ABC269 C

# 入力の受け取り
N=int(input())
 
# Nを2進数へ変換
Nbit=bin(N)
# 「0b」を消す
Nbit=Nbit[2:]
# 反転
Nbit=Nbit[::-1]
 
# xlistへ空の文字列を入れておく
xlist=[""]
 
# i=0~(Nbitの長さ-1)まで
for i in range(len(Nbit)):
    # 新しいxlistのリスト
    Newxlist=[]
 
    # Nの右からi桁目が「0」ならば
    if Nbit[i]=="0":
        # x:xlistの要素を順に格納
        for x in xlist:
            # 先頭に「0」をつける
            Newxlist.append("0"+x)
   
    # Nの右からi桁目が「1」ならば
    else:
        # # x:xlistの要素を順に格納
        for x in xlist:
            # 先頭に「0」をつける
            Newxlist.append("0"+x)
            # 先頭に「1」をつける
            Newxlist.append("1"+x)
   
    # xlistを更新
    xlist=Newxlist
 
# xを10進数に変換した数の格納リスト
anslist=[]
 
# # x:xlistの要素を順に格納
for x in xlist:
    # 10進数へ変換して追加
    anslist.append(int(x,2))
 
# 小さい順に並び替え
anslist.sort()
 
# ans:anslistの要素を順に格納
for ans in anslist:
    # ansを10進数へ変換
    print(ans)

ABC269 D

# 入力の受け取り
N=int(input())
 
# 黒いマスの管理
Black=[[0]*3000 for i in range(3000)]
 
# スタート地点の候補
Start=[]
 
# N回
for i in range(N):
    # 入力の受け取り
    X,Y=map(int,input().split())
   
    # 0以上にするため1000プラスする
    X+=1000
    Y+=1000
    # (X,Y)が黒いマス
    Black[X][Y]=1
    # スタート地点の候補
    Start.append([X,Y])
 
# 訪問済み座標の管理
visited=[[False]*3000 for i in range(3000)]
 
# dequeを用意
from collections import deque
que=deque()
 
# 答え
ans=0
 
# (1)Startから座標を取り出す
for X,Y in Start:
    # (2)取り出した座標が訪問済みでなければキューに入れて、訪問済みにする
    if visited[X][Y]==0:
        # キューへ追加
        que.append([X,Y])
        # 訪問済みにする
        visited[X][Y]=1
        # 答えをプラス1
        ans+=1
 
        # (6)キューが空になるまで(4)を繰り返す。空になったら(1)へ戻る
        while 0<len(que):
            # (4)キューの左端から座標を取り出す(今いる座標)
            NowX,NowY=que.popleft()
 
            # (5)今いる座標から進める座標が黒マスかつ訪問済みでなければ、訪問済みにし、キューへ入れる
            if Black[NowX-1][NowY-1]==1 and visited[NowX-1][NowY-1]==0:
                # 訪問済みにする
                visited[NowX-1][NowY-1]=1
                # キューに入れる
                que.append([NowX-1,NowY-1])
            if Black[NowX-1][NowY]==1 and visited[NowX-1][NowY]==0:
                visited[NowX-1][NowY]=1
                que.append([NowX-1,NowY])
            if Black[NowX][NowY-1]==1 and visited[NowX][NowY-1]==0:
                visited[NowX][NowY-1]=1
                que.append([NowX,NowY-1])
            if Black[NowX][NowY+1]==1 and visited[NowX][NowY+1]==0:
                visited[NowX][NowY+1]=1
                que.append([NowX,NowY+1])
            if Black[NowX+1][NowY]==1 and visited[NowX+1][NowY]==0:
                visited[NowX+1][NowY]=1
                que.append([NowX+1,NowY])
            if Black[NowX+1][NowY+1]==1 and visited[NowX+1][NowY+1]==0:
                visited[NowX+1][NowY+1]=1
                que.append([NowX+1,NowY+1])
 
# 答えの出力
print(ans)

ABC269 E

# 入力の受け取り
N=int(input())
 
# 行の探索範囲
Gmin=1
Gmax=N
 
# 列の探索範囲
Rmin=1
Rmax=N
 
# 20回
for i in range(20):
 
    # 範囲の中央を確認
    Gcen=(Gmin+Gmax)//2
    Rcen=(Rmin+Rmax)//2
 
    # Gmin~Gcenの個数を確認
    print("?",Gmin,Gcen,1,N)
    T=int(input())
 
    # 答えが(Gcen-Gmin+1)より小さいならば
    if T<Gcen-Gmin+1:
        # Gmin~Gcen行目のどこかに置ける
        Gmax=Gcen
    # それ以外(答えが(Gcen-Gmin+1)ならば)
    else:
        # (Gcen+1)~Gmax行目のどこかに置ける
        Gmin=Gcen+1
   
    # 列も同様
    print("?",1,N,Rmin,Rcen)
    T=int(input())
 
    if T<Rcen-Rmin+1:
        Rmax=Rcen
    else:
        Rmin=Rcen+1
 
    # 行、列の範囲が定まったら
    if Gmin==Gmax and Rmin==Rmax:
        # 答えの出力
        print("!",Gmin,Rmin)
        # 終了
        exit()

ABC270 A

# 入力の受け取り
A,B=map(int,input().split())
 
# 1点問題が解けたら=1
X=0
# 2点問題が解けたら=1
Y=0
# 4点問題が解けたら=1
Z=0
 
# A=1ならば
if A==1:
    # X=1にする
    X=1
elif A==2:
    Y=1
elif A==3:
    X=1
    Y=1
elif A==4:
    Z=1
elif A==5:
    X=1
    Z=1
elif A==6:
    Y=1
    Z=1
elif A==7:
    X=1
    Y=1
    Z=1
 
# Bも同様
if B==1:
    X=1
elif B==2:
    Y=1
elif B==3:
    X=1
    Y=1
elif B==4:
    Z=1
elif B==5:
    X=1
    Z=1
elif B==6:
    Y=1
    Z=1
elif B==7:
    X=1
    Y=1
    Z=1
 
# 答え
ans=0
 
# 1点問題が解けていたら
if X==1:
    # 答えにプラス1
    ans+=1
# 2点問題が解けていたら
if Y==1:
    # 答えにプラス2
    ans+=2
# 4点問題が解けていたら
if Z==1:
    # 答えにプラス4
    ans+=4
 
# 答えの出力
print(ans)
# 入力の受け取り
A,B=map(int,input().split())
 
# AorBを計算
print(A|B)

ABC270 B

# 入力の受け取り
X,Y,Z=map(int,input().split())
 
# -1になるパターン
if 0<Y<X<Z or 0<Y<Z<X or X<Z<Y<0 or Z<X<Y<0:
    # -1を出力
    print(-1)
# 2|Z|+|X|になるパターン
elif X<Y<0<Z or Z<0<Y<X:
    # 2|Z|+|X|を出力
    print(2*abs(Z)+abs(X))
# それ以外
else:
    # |X|を出力
    print(abs(X))

ABC270 C

# 入力の受け取り
N,X,Y=map(int,input().split())
 
# 繋がっている頂点の記録
# connect[1]=[2,3,4]なら頂点1から頂点2,3,4へ行ける
connect=[[] for i in range(N+1)]
 
# (N-1)回
for i in range(N-1):
    # 入力の受け取り
    U,V=map(int,input().split())
    # 繋がっている頂点の記録
    connect[U].append(V)
    connect[V].append(U)
 
# 頂点Xからの距離(初期値は-1)
Dist=[-1]*(N+1)
# 頂点Xの距離は0
Dist[X]=0
 
# キューを用意
# インポート
from collections import deque
que=deque()
 
# (1)Xをキューへ追加
que.append(X)
 
# (4)キューが空になるまで(2)~(3)を繰り返す
while 0<len(que):
    # (2)キューの左端(先頭)から頂点を取り出す(今いる頂点)
    Now=que.popleft()
 
    # (3)今いる頂点から行ける頂点について
    # to:今いる頂点から行ける頂点
    for to in connect[Now]:
        # ・距離が更新されていないならば(まだ到達していない頂点ならば)
        if Dist[to]==-1:
            # 距離を記録(今いる頂点の距離+1)
            Dist[to]=Dist[Now]+1
            # キューへ追加
            que.append(to)
 
# 答え
ans=deque()
 
# 頂点Yの距離
Count=Dist[Y]
 
# 今いる頂点
Now=Y
 
# Countが1以上の間
while 0<Count:
    # 答えの左端(先頭)に今いる頂点を追加
    ans.appendleft(Now)
 
    # 今いる頂点から行ける頂点
    for to in connect[Now]:
        # 距離が(Count-1)である頂点を見つけたら
        if Dist[to]==Count-1:
            # Countをマイナス1
            Count-=1
            # その頂点へ移動
            Now=to
 
# 答えの先頭にXを追加
ans.appendleft(X)
 
# 答えの出力(*をつけるとカッコなしで出力できる)
print(*ans)
0
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
0
0