enlace de tema
https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216
ideas
Consideramos esta relación familiar como un árbol binario, el nodo raíz del árbol es el elemento hijo, el "hijo izquierdo" es el padre y el "hijo derecho" es la madre, y luego definimos isman[i]isman[ i]i s m a n [ i ] Si lo es true
, significa queid
el género del número esmasculino, de lo contrario esfemenino, y luego cada vez que ingresamos una línea de datos, conectamos los bordes, el punto de partida es el actual número, el punto final es el número principal (si existe), y luego estamos enQ
Cuando pregunte por segunda vez, primero determine si los dos números son del sexo opuesto, y luego usaremos el número actual como el número inicial punto para una longitud menor o igual a5 5Todos los puntos set
de 5set
se ponen en uno, y el otro es igual, solo necesitamos atravesar uno de ellos yset
averiguar si hay un elemento actual en el otro para determinar si hay una intersección dentro de 5 generaciones. no hay intersección, luego salidaYes
otra salidaNo
código
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f
const int N = 1e5+10;
int n,q;
vector<int> V[N];
bool isman[N];
void dfs(int id,int deep,set<int> &ans) {
if(deep == 6) return;
ans.insert(id);
for(auto it : V[id])
dfs(it,deep + 1,ans);
}
void slove(int l,int r){
if(isman[l] == isman[r]){
cout<<"Never Mind"<<endl;
return;
}
set<int> S1,S2;
dfs(l,1,S1);
dfs(r,1,S2);
bool fg = false;
for(auto it : S1){
if(S2.find(it) != S2.end()) {
fg = true;
break;
}
}
if(fg) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
int id,fa,ma;
char sex;
for(int i = 1;i <= n; ++i) {
cin>>id>>sex>>fa>>ma;
if(fa + 1) V[id].push_back(fa),isman[fa] = true;
if(ma + 1) V[id].push_back(ma);
if(sex == 'M') isman[id] = true;
else isman[id] = false;
}
cin>>q;
int l,r;
while(q--) {
cin>>l>>r;
slove(l,r);
}
return 0;
}