2021. 1. 12. 16:39ใ๐จ๐ป๐ซ ํ๋ก๊ทธ๋๋ฐ/BOJ(๋ฐฑ์ค)
๋ฌธ์ ๋งํฌ: [๋ฐฑ์ค] 13306๋ฒ ํธ๋ฆฌ
1. ๋ฌธ์ ์์ฝ
ํธ๋ฆฌ๊ตฌ์กฐ์์ ๋ถ๋ชจ์ ์ ์ ๋ํ ์ ๋ณด์ ์ฐ๊ฒฐ๊ฒฝ๋ก๋ฅผ ๋ฌป๋ ๋ฌธ์ ์ธ๋ฐ์. ์งํฉ์ ๋ํ์์์ ๋ถ๋ชจ์ ์ ๋น์ทํ ๋ง ๊ฐ์ง์๋์? ์ ๋ฒ ์๋ฃ๊ตฌ์กฐ ํฌ์คํ ์์ ๋ค๋ค๋ ๋์ค์กฐ์ธํธ ์๋ฃ๊ตฌ์กฐ์ ์ ๋์จ ํ์ธ๋ ์ฐ์ฐ์ ์ด์ฉํ์ฌ ํธ๋ ๋ฌธ์ ์์ต๋๋ค.
N๊ฐ์ ์ ์ ์ด ์ซ์ 1๋ถํฐ N๊น์ง๋ก ํํ๋๊ณ ๋ฃจํธ๋ ํญ์ 1์ ๋๋ค. ํธ๋ฆฌ์ ์ ์ ๊ฐ์ N, ์ง์์ ๊ฐ์ Q๊ฐ ์ฃผ์ด์ง๊ณ 2๋ฒ์ ์ ๋ถํฐ N๋ฒ ์ ์ ๊น์ง ๋ถ๋ชจ์ ์ ์ ๋ํ๋ด๋ ์ ์ a๊ฐ ์ฃผ์ด์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ (N-1)+Q ์ค ์์ ๋ ๊ฐ์ง ํํ์ ์ ๋ ฅ์ด ์ฃผ์ด์ง๋๋ฐ ์ฒซ ๋ฒ์งธ๋ ๊ฒฝ๋ก์ญ์ ์ด๊ณ ๋ ๋ฒ์งธ๋ ๋ ์ ์ ๊ฐ์ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋์ง ๋ฌป๋ ์ง์์ ๋๋ค.
2. ๋ฌธ์ ํ์ด ๋ฐ ์ฝ๋
์ถ๋ ฅ๋ถ๋ฅผ ๋ณด๋ฉด ์ง์์ ๋ํ ๋ต์ ์์๋๋ก Q๊ฐ์ ์ค์ YES or No ๋ก์ถ๋ ฅํ๋ค๊ณ ํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ N-1+Q ์ค ๊ฐ์ ๋ค์ด์ค๋ ๋ชจ๋ ์ ๋ ฅ์ ์คํ๊ตฌ์กฐ์ ์์ฐจ์ ์ผ๋ก ์ ์ฅํ๋ฉด์ ๊ฒฝ๋ก๋ฅผ ์ญ์ ํ๋ ์ ๋ ฅ์ธ ๊ฒฝ์ฐ์ ๋ฏธ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ญ์ ํ์ต๋๋ค. ๊ทธ ๊ณผ์ ์ด ๋๋๋ฉด ์คํ์์ ๋ง์ง๋ง ์ง์์ ๋ํ ๋ต๋ถํฐ Find ์ฐ์ฐ์ ํตํด ๋ํ์์๋ฅผ ํ์ธํ๊ณ (์ฐ๊ฒฐ ์ฌ๋ถ ํ์ธ) ๋ต์ ans ์คํ์ ์ง์ด ๋ฃ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ญ์ ์ ๋ ฅ์ด ๋ค์ด์๋ ์ฐจ๋ก๊ฐ ์ค๋ฉด ๋ถ๋ชจ์ ์์๋ ธ๋๋ฅผ Union ์ฐ์ฐ์ ํตํด ๋ค์ ์ฐ๊ฒฐ์์ผ์ฃผ์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก ans ์คํ์ ์ถ๋ ฅํจ์ผ๋ก์ ๋ฌธ์ ๋ฅผ ํ ์ ์์์ต๋๋ค.
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,pair<int,int>> ipii;
const int MAX = 200000 + 1;
int N,Q,par[MAX];
stack<ipii> qList;
stack<string> ans;
// Find ์ฐ์ฐ
int doFind(int x){
if(x==par[x]) return x;
return par[x]=doFind(par[x]);
}
// Union ์ฐ์ฐ
void doUnion(int a, int b){
a=doFind(a);
b=doFind(b);
if(a==b) return;
par[a]=b;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin>>N>>Q;
for(int i=1;i<=N-1;i++){
int parNode;
cin>>parNode;
par[i+1]=parNode;
}
int cnt=N-1+Q;
while(cnt--){
int x,b,c,d;
cin>>x;
if(!x) {
cin>>b;
// ๊ฒฝ๋ก ์ญ์ : first: 0 second: {์์,๋ถ๋ชจ}
qList.push({0,{b,par[b]}});
// ๊ฒฝ๋ก ์ญ์ : ๋ถ๋ชจ == ์๊ธฐ ์์
par[b]=b;
}
else{
cin>>c>>d;
// ์ง์ first: 1 second: {c,d}
qList.push({1,{c,d}});
}
}
while(!qList.empty()){
// ์ง์
if(qList.top().first){
int c=qList.top().second.first;
int d=qList.top().second.second;
// Find์ฐ์ฐ๋ฅผ ํตํด ์ฐ๊ฒฐ ํ์ธ
if(doFind(c)==doFind(d)) ans.push("YES");
else ans.push("NO");
}
// ๊ฒฝ๋ก ์ญ์ : Union์ฐ์ฐ์ ํตํด ๋ค์ ์ฐ๊ฒฐ
else{
int par=qList.top().second.second;
int child=qList.top().second.first;
doUnion(child,par);
}
qList.pop();
}
while(!ans.empty()){
cout<<ans.top()<<"\n";
ans.pop();
}
return 0;
}
3. ๋ง๋ฌด๋ฆฌ
๋ ์ข์ ํ์ด๋ ๋ถ์กฑํ ๋ถ๋ถ ์ธ์ ๋ ์ง ์ง์ ๊ณผ ์กฐ์ธ ๊ฐ์ฌํฉ๋๋ค!
'๐จ๐ปโ๐ซ ํ๋ก๊ทธ๋๋ฐ > BOJ(๋ฐฑ์ค)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 11377๋ฒ: ์ดํ๊ฐํธ 3 (0) | 2021.01.10 |
---|---|
[๋ฐฑ์ค] 9576๋ฒ: ์ฑ ๋๋ ์ฃผ๊ธฐ (0) | 2020.12.28 |
[๋ฐฑ์ค] 2470 ๋ฒ: ๋ ์ฉ์ก (0) | 2020.12.26 |
[๋ฐฑ์ค] 1644๋ฒ: ์์์ ์ฐ์ํฉ (0) | 2020.12.25 |
[๋ฐฑ์ค] 1054๋ฒ: ํน์ ํ ์ต๋จ ๊ฒฝ๋ก (0) | 2020.12.21 |