题目内容
输入样例
5 4
46 23 26 24 10
24 is the root
26 and 23 are siblings
46 is the parent of 23
23 is a child of 10
输出样例
F
T
F
T
坑点
注意对负数的字符串转数字做特殊处理。
大致思路就是利用make_heap
建立一个小顶堆,然后根据小顶堆的值得性质判断。
假设容器名为node
,设某节点左孩子的下标为l
,右孩子的下标为r
,设他们的父节点为Node
N
o
d
e
=
n
o
d
e
[
l
−
1
>
>
1
]
=
n
o
d
e
[
r
−
1
>
>
1
]
Node = node[l-1>>1] = node[r-1 >> 1]
Node=node[l−1>>1]=node[r−1>>1]
AC代码
#include<bits/stdc++.h>
#include<algorithm>
#define ios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define ll long long
#define pii pair<int,int>
using namespace std;
int n, m;
std::vector<int> a;
map<int, int> p;//标记数字在数组中的下标
int ChangeToNum(string s){
int res = 0, flag = 1;
if(s[0] == '-')flag = -1, s.erase(0, 1);
for(auto it : s){
res = res*10+(it-'0');
}
return res*flag;
}
string func(string s) {
int vim = s.find(" ");
int x = ChangeToNum(s.substr(0, vim));
if (s.find("root") != -1) {
if(p[x] == 0)return "T";
else return "F";
}
else if (s.find("siblings") != -1) {
s.erase(0, vim+5);
vim = s.find(" ");
int y = ChangeToNum(s.substr(0, vim));
if(p[a[(p[x]-1) >> 1]] == p[a[(p[y]-1) >> 1]])return "T";
else return "F";
}
else if (s.find("parent") != -1) {
s.erase(0, vim+18);
int y = ChangeToNum(s);
if(p[a[(p[y]-1) >> 1]] == p[x])return "T";
else return "F";
}
else {
s.erase(0, vim+15);
int y = ChangeToNum(s);
if(p[a[(p[x]-1) >> 1]] == p[y])return "T";
else return "F";
}
}
int main() {
ios;
cin >> n >> m;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
a.push_back(x);
make_heap(a.begin(), a.end(), greater<int>());
}
for (int i = 0; i < n; i++)p[a[i]] = i;
cin.ignore(0x7fffffff, '\n');
while ( m-- ) {
string s;
getline(cin, s);
cout << func(s) << "\n";
}
return 0;
}