トップページ -> AOJの解答例 -> ITP2_7の解答例

ITP2_7の解答例(Python)

Setに対して操作を行う問題です.

1. ITP2_7_A: Set: Search

入力に対してsetの操作を行う問題です.

# ITP2_7_A

n = int(input())
S = set()
for _ in range(n):
    query = list(map(int,input().split(" ")))
    # insert: add で追加
    if query[0] == 0:
        S.add(query[1])
        print(len(S)) # 長さの報告
    # find
    else:
        print(int(query[1] in S))

2. ITP2_7_B: Set: Delete

Aの操作に加えてdeleteも行います.

# ITP2_7_B
# insert, find は ITP2_7_A と同じ

n = int(input())
S = set()
for _ in range(n):
    query = list(map(int,input().split(" ")))
    # insert: add で追加
    if query[0] == 0:
        S.add(query[1])
        print(len(S)) # 長さの報告
    # find
    elif query[0] == 1:
        print(int(query[1] in S))
    # delete: romoveで削除する
    else:
        # 存在しない場合に削除しようとするとエラーになる
        if query[1] in S:
            S.remove(query[1])

3. ITP2_7_C: Set: Range Search

Bの操作に加えてdumpも行います. 単純にループを回すと時間制限に引っかかるのでSの長さによって処理を変えています.

# ITP2_7_C
# insert, find, delete は ITP2_7_B と同じ

n = int(input())
S = set()
for _ in range(n):
    query = list(map(int,input().split(" ")))
    # insert: add で追加
    if query[0] == 0:
        S.add(query[1])
        print(len(S)) # 長さの報告
    # find
    elif query[0] == 1:
        print(int(query[1] in S))
    # delete: romoveで削除する
    elif query[0] == 2:
        # 存在しない場合に削除しようとするとエラーになる
        if query[1] in S:
            S.remove(query[1])
    # dump
    else:
        L,R = query[1],query[2]
        # 単純にループを回すと時間が切れるので S の長さで処理を変えました
        if len(S) < R-L:
            num_list = []
            for x in sorted(S):
                if L <= x <= R:
                    print(x)
                    
        else:
            for i in range(L,R+1):
                if i in S:
                    print(i)

4. ITP2_7_D: Multi-Set

今までと異なり重複を許す集合に関してです. cnt_dictで含まれる個数を管理しています. cnt_dictのキーを何度もsortしなくて済むようにsorted_keyで並び替えられた状態にあるかを管理しています.

# insert, find, delete は ITP2_7_B と同じ

n = int(input())
S = set()
cnt_dict = {}
length = 0
sorted_key= False
for _ in range(n):
    query = list(map(int,input().split(" ")))
    # insert: add で追加
    if query[0] == 0:
        if query[1] not in cnt_dict.keys():
            S.add(query[1])
            cnt_dict[query[1]] = 1
        else:
            if cnt_dict[query[1]] == 0:
                S.add(query[1])
            cnt_dict[query[1]] += 1
            
        length += 1
        sorted_key = False
        print(length) # 長さの報告
    # find
    elif query[0] == 1:
        if query[1] in S:
            print(cnt_dict[query[1]])
        else:
            print(0)
    # delete: romoveで削除する
    elif query[0] == 2:
        # 存在しない場合に削除しようとするとエラーになる
        if query[1] in S:
            S.remove(query[1])
            length -= cnt_dict[query[1]]
            
        cnt_dict[query[1]] = 0
    # dump
    else:
        L,R = query[1],query[2]
        if not sorted_key:
            key_list = list(cnt_dict.keys())
            key_list.sort()
            sorted_key = key_list
           
        if len(sorted_key) <= R-L:
            for key in sorted_key:
                if L <= key <= R:
                    cnt = cnt_dict[key]
                    for _ in range(cnt):
                        print(key)
        else:
            for key in range(L,R+1):
                if key in S:
                    cnt = cnt_dict[key]
                    for _ in range(cnt):
                        print(key)

<- 前へ戻る 【目次に戻る】 次へ進む ->