-
[백준] 14287 - 내리 갈굼 3Algorithm 문제 2019. 12. 19. 16:01
https://www.acmicpc.net/problem/14287
내리 갈굼 2 문제에서 거꾸로 부하가 상사를 갈구는 문제.
상사가 받은 갈굼 정도는 부하들이 받은 내리갈굼의 합과 같다.
전위순회로 트리를 구조화하고 구간합을 구하는 segment tree로 답을 구할 수 있다.
<C++ code>
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081#include <cstdio>#include <vector>#include <cmath>using namespace std;int n, m;vector<int> tree, lazy, arr, l, r, child[100001], v;void preorder(int node, int& cnt){l[node] = ++cnt;for(int i: child[node]){preorder(i, cnt);}r[node] = cnt;}void update_lazy(int node, int start, int end){if(lazy[node] != 0){tree[node] += lazy[node];if(start != end){lazy[node * 2] += lazy[node];lazy[node * 2 + 1] += lazy[node];}lazy[node] = 0;}}void update_range(int node, int start, int end, int left, int right, int diff){update_lazy(node, start, end);if(left > end || right < start) return;if(left <= start && end <= right){tree[node] += diff;if(start != end){lazy[node * 2] += diff;lazy[node * 2 + 1] += diff;}return;}update_range(node * 2, start, (start + end) / 2, left, right, diff);update_range(node * 2 + 1, (start + end) / 2 + 1, end, left, right, diff);tree[node] = tree[node * 2] + tree[node * 2 + 1];}int query(int node, int start, int end, int left, int right){update_lazy(node, start, end);if(left > end || right < start) return 0;if(left <= start && end <= right) return tree[node];return query(node * 2, start, (start + end) / 2, left, right) + query(node * 2 + 1, (start + end) / 2 + 1, end, left, right);}int main(){int tmp, cnt = 0;scanf("%d %d", &n, &m);scanf("%d", &tmp);for(int i=2; i<=n; i++){scanf("%d", &tmp);child[tmp].push_back(i);}l.resize(n+1);r.resize(n+1);preorder(1, cnt);int h = (int)ceil(log2(n));int tree_size = (1 << (h + 1)) - 1;tree.resize(tree_size);lazy.resize(tree_size);while(m--){int a, b, c;scanf("%d %d", &a, &b);if(a == 1){scanf("%d", &c);update_range(1, 0, n-1, l[b]-1, l[b]-1, c);}else{printf("%d\n", query(1, 0, n-1, l[b]-1, r[b]-1));}}return 0;}cs 'Algorithm 문제' 카테고리의 다른 글
[백준] 2820 - 자동차 공장 (0) 2019.12.18 [백준] 14268 - 내리 갈굼 2 (0) 2019.12.09 [백준] 14267 - 내리갈굼 (0) 2019.12.09 [백준] 17822 - 원판 돌리기 (0) 2019.12.02 [백준] 2357 - 최솟값과 최댓값 (0) 2019.11.30