BOJ 14428数列とクエリー16
質問する
BOJ 14428数列とクエリー16
金色I|白駿14428|Python 3 Python池
アルゴリズム#アルゴリズム#
セグメントツリーの資料構造を理解することは、容易に解決できる問題です.
この問題では、まずセグメントツリーを使用して最適な値を探します.△最高価格を知っていれば、インデックスはもちろん知っています.10868最高価格の問題と非常に似ていますが、最高値ではなく、値のインデックスを出力する必要があります.この場合、index()関数を使用して値のインデックスを検索するには、より長いO(N)時間がかかるため、配列自体に値とインデックスが含まれます.
[5, 3, 4, 1, 2]
-> [[5, 1], [3, 2], [4, 3], [1, 4], [2, 5]]
比較値が大きい場合、ターゲットは値ではなくリストになるため、リスト内の0番目のインデックス値のサイズを比較するためにmin()関数を個別に記述します.
親は子供の中に小銭がある.(最大値ではなくインデックスを出力する必要があるため、リストです.)
コード#コード#
import sys
from math import *
input = sys.stdin.readline
INF = sys.maxsize
# 리스트의 대소를 비교하기 위한 사용자정의 min 함수
def min(a : list, b : list) -> list:
if a[0] > b[0]:
return b
else:
return a
# 세그먼트 트리 생성 함수
def initTree(node, start, end):
if start == end:
segtree[node] = values[start]
return segtree[node]
mid = (start + end) // 2
segtree[node] = min(initTree(node * 2, start, mid), initTree(node * 2 + 1, mid + 1, end))
return segtree[node]
# 세그먼트 트리 쿼리 함수
def query(node, start, end, left, right):
if start > right or end < left:
return [INF, INF]
if left <= start and end <= right:
return segtree[node]
mid = (start + end) // 2
return min(query(node * 2, start, mid, left, right), query(node * 2 + 1, mid + 1, end, left, right))
# 트리 업데이트 함수
def update(node, start, end, index, x):
if index < start or index > end:
return [INF, INF]
if start == end:
segtree[node] = x
return
mid = (start + end) // 2
update(node * 2, start, mid, index, x)
update(node * 2 + 1, mid + 1, end, index, x)
segtree[node] = min(segtree[node * 2], segtree[node * 2 + 1])
N = int(input())
temp = list(map(int, input().split()))
values = [[0, 0] for _ in range(N)]
# 입력 값을 [값, 인덱스] 형태로 변환해 리스트 저장
for i in range(N):
values[i][0] = temp[i]
values[i][1] = i + 1
# 세그먼트 트리 사이즈
ts = 1 << (int(ceil(log2(N))) + 1)
segtree = [0] * ts
# 트리 생성
initTree(1, 0, N - 1)
M = int(input())
for _ in range(M):
A, B, C = map(int, input().split())
# 트리 값 변경
if A == 1:
values[B - 1][0] = C
update(1, 0, N - 1, B - 1, values[B - 1])
# 구간 출력
else:
print(query(1, 0, N - 1, B - 1, C - 1)[1])
結果
Reference
この問題について(BOJ 14428数列とクエリー16), 我々は、より多くの情報をここで見つけました https://velog.io/@leehe228/boj14428テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol