내용으로 건너뛰기
테페리넷
사용자 도구
등록
로그인
사이트 도구
검색
도구
문서 보기
Fold/unfold all
역링크
미디어 관리자
사이트맵
등록
로그인
>
미디어 관리자
사이트맵
현재 위치:
테페리넷
»
Problem Solving
»
문제
»
백준 온라인 저지 (BOJ)
»
주식회사 승범이네
ps:problems:boj:16404
이 문서는 읽기 전용입니다. 원본을 볼 수는 있지만 바꿀 수는 없습니다. 문제가 있다고 생각하면 관리자에게 문의하세요.
====== 주식회사 승범이네 ====== ===== 풀이 ===== * [[ps:구간 쿼리#오일러 경로 테크닉]]을 적용한 뒤, 구간합 업데이트 + 포인트 쿼리를 처리하는 문제. * 서브트리의 루트도 업데이트 된다는 점만 제외하면 [[ps:problems:boj:2820|자동차 공장]]과 동일한 문제이므로, 자세한 풀이는 그쪽을 참조. * [[ps:problems:boj:14268|회사 문화 2]]와는 문제가 전부 똑같다. ===== 코드 ===== <dkpr py> """Solution code for "BOJ 16404. 주식회사 승범이네". - Problem link: https://www.acmicpc.net/problem/16404 - Solution link: http://www.teferi.net/ps/problems/boj/16404 """ import sys from teflib import fenwicktree from teflib import tgraph def euler_tour_technique(tree, root): subtree_ranges = [[None, None] for _ in tree] order = 0 for node in tgraph.dfs(tree, root, yields_on_leave=True): if subtree_ranges[node][0] is None: subtree_ranges[node][0] = order order += 1 else: subtree_ranges[node][1] = order return subtree_ranges def main(): N, M = [int(x) for x in sys.stdin.readline().split()] tree = [[] for _ in range(N)] for i, boss in enumerate(sys.stdin.readline().split()): if boss != '-1': tree[int(boss) - 1].append(i) subtree_ranges = euler_tour_technique(tree, 0) fenwick = fenwicktree.FenwickTree(N + 1) for i in range(M): query = [int(x) for x in sys.stdin.readline().split()] if query[0] == 1: _, i, w = query beg, end = subtree_ranges[i - 1] fenwick.update(beg, w) fenwick.update(end, -w) else: _, i = query print(fenwick.query(0, subtree_ranges[i - 1][0] + 1)) if __name__ == '__main__': main() </dkpr> * Dependency: [[:ps:teflib:fenwicktree#FenwickTree|teflib.fenwicktree.FenwickTree]], [[:ps:teflib:tgraph#dfs|teflib.tgraph.dfs]] {{tag>BOJ ps:problems:boj:플래티넘_3}}
ps/problems/boj/16404.txt
· 마지막으로 수정됨: 2021/04/30 13:36 저자
teferi
문서 도구
문서 보기
역링크
Fold/unfold all
맨 위로