-
[백준] 14267 - 내리갈굼Algorithm 문제 2019. 12. 9. 18:29
https://www.acmicpc.net/problem/14267
14267번: 내리 갈굼
영선회사에는 치명적인 악습이 있는데, 바로 상사가 직속 부하를 갈구면 그 부하가 부하의 직속 부하를 연쇄적으로 갈구는 내리 갈굼이 있다. 즉, 상사가 한 직속 부하를 갈구면 그 부하의 모든 부하들이 갈굼을 당한다. 갈굼에 대해 정도에 대한 수치가 주어지는데, 이 수치 또한 부하들에게 똑같이 갈궈진다. 직속 상사와 직속 부하관계에 대해 주어지고, 갈굼에 대한 정보가 주어질 때, 각자 얼마의 갈굼을 당했는지 출력하시오,
www.acmicpc.net
갈굼 수치를 입력받을 때, 바로 모든 수치를 전파하는 것은 비효율적이다.
모든 수치를 입력받은 후에, 해당 부모의 수치를 갱신하고 자식에게 전파하는 경우 불필요한 탐색과 갱신을 줄일 수 있다.
이 문제의 경우에는 부모가 자식보다 작은 수를 가지므로 1번부터 순서대로 답을 구하면 된다.
<C++ 코드>
1234567891011121314151617181920212223242526272829303132333435#include <cstdio>#include <vector>using namespace std;int n, m;vector<int> par[100001];vector<int> re, diff;int main(){int t;scanf("%d %d", &n, &m);re.resize(n+1);diff.resize(n+1);scanf("%d", &t);for(int i=2; i<=n; i++){scanf("%d", &t);par[t].push_back(i);}for(int i=0; i<m; i++){int a, b;scanf("%d %d", &a, &b);diff[a] += b;}for(int i=1; i<=n; i++){if(diff[i] != 0){re[i] += diff[i];for(int j=0; j<par[i].size(); j++){diff[par[i][j]] += diff[i];}diff[i] = 0;}printf("%d ", re[i]);}return 0;}cs 'Algorithm 문제' 카테고리의 다른 글
[백준] 2820 - 자동차 공장 (0) 2019.12.18 [백준] 14268 - 내리 갈굼 2 (0) 2019.12.09 [백준] 17822 - 원판 돌리기 (0) 2019.12.02 [백준] 2357 - 최솟값과 최댓값 (0) 2019.11.30 [백준] 12766 - 지사 배정 (0) 2019.11.26