https://codeforces.com/contest/1739/problem/D 이 문제 인데..
우선 파라메트릭 인건 찾았고, 되는지 안되는지 판단할 때, 나는 dfs를 써서,
- int d[200001];
- int c;
- void dfs(int cur, int par) {
- d[cur] = 1;
- for (int next : v[cur]) {
- dfs(next, cur);
- d[cur] = max(d[cur], d[next] + 1);
- }
- if (d[cur] == c && par > 1) {
- tmp++, d[cur] = 0;
- }
- }
이런식으로, 구현을 했는데 고수들 코딩봤더니
- bool check(int w){
- int ans=0;
- for(int i=n;i>=2;i--) d[i]=1;
- for(int i=n;i>=2;i--){
- if(d[i]==w&&fa[i]!=1) ans++;
- else d[fa[i]]=max(d[fa[i]],d[i]+1);
- }
- return ans<=k;
- }
이런식으로 for문 한번으로 확인하더라고
내방식은 dfs 쫙 돌린다음 리프노트부터 보는 거니까 그러려니 하는데 저렇게 for문 한번만 돌리는 거로도 확인이 가능함..??
뭔가 막 중간에 꼬여서 안될 거 같은데 도대체 왜 되는지 이유를 못찾겠음 ㅠㅠ
뭔가 경로압축 돌리는 거처럼 보이는데
구글에 경로 압축으로 검색해서 찾아보면 될까요??
1 <= Pi < i
자식노드가 항상 부모보다 오른쪽에 있으니 뒤쪽 부터 돌리면 dfs돌린거랑 같은 결과를 얻을 수 있음
와 생각해보니 그러네요 정말감사합니다!