视频多平台发布网站优化哪个公司好
L2-012 关于堆的判断 - 团体程序设计天梯赛-练习集
实战反思
// 建立小顶堆的过程:接收一个,就插入一个
for (int i = 1; i <= N;i++){//建立小顶堆:记住,边插边建!cin >> vec[i];int k=i;while(k>1 && vec[k]<vec[k/2]){swap(vec[k],vec[k/2]);k/=2;}}
//int idx = str.find(to_find, start)
注意:是从start开始向后查找,且包含start位置本身!
//ps: rfind(tofind, start)函数是从是从start开始向前查找,且同样包含start位置本身!
注意:没有找到返回-1,但是if(-1)会被判断为true,所以应该用if(str.find(to_find) == -1)表示查找失败
//字符串转整数:stoi(str)
//误:兄弟节点的判断:兄弟 != 存储位置差为一,后者有可能并非同属于一个父亲
对于完全二叉树,用 idx1 / 2 == idx2 / 2来判断
代码实现
#include<bits/stdc++.h>
using namespace std;
//重复数字?
int find_idx(int val, vector<int>vec)
{for(int i=1; i<vec.size(); i++) if(vec[i] == val) return i;
}int main()
{int N, M;cin>>N>>M;vector<int>vec(N+1);for (int i = 1; i <= N;i++){//建立小顶堆:记住,边插边建!cin >> vec[i];int k=i;while(k>1 && vec[k]<vec[k/2]){swap(vec[k],vec[k/2]);k/=2;}}string str;getline(cin, str);for(int i=0; i<M; i++){getline(cin, str);int idx = str.find(' ');//利用空格号确定语句中数字的位置string str_num = str.substr(0, idx);//误!作用:从起始位置开始提取idx个字符!int num1 = stoi(str_num);int idx1 = find_idx(num1, vec);if(str.find("root") != -1)//误!没找到返回-1,所以if(str.find("root"))在没找到时为true{if(idx1 == 1) cout<<"T"<<endl;else cout<<"F"<<endl;continue;}else if(str.find("siblings") != -1){int lf = str.find(' ', idx+1);int rt = str.find(' ', lf+1);//误!从查找位开始,但包含查找位!str_num = str.substr(lf+1, rt-1-lf);int num2 = stoi(str_num);//stoi函数不熟!int idx2 = find_idx(num2, vec);if(idx1 / 2 == idx2 / 2) cout<<"T"<<endl;//兄弟节点不等价于相邻存储!相邻的不一定有同一个father!else cout<<"F"<<endl;continue;}int lf = str.rfind(' ');//从该位置开始 向前 查找!str_num = str.substr(lf+1, str.length()-1-lf);int num2 = stoi(str_num);if(str.find("parent") != -1){int fa = find_idx(num2, vec) / 2;if(fa == find_idx(num1, vec)) cout<<"T"<<endl;else cout<<"F"<<endl;}else{int fa = find_idx(num1, vec) / 2;if(fa == find_idx(num2, vec)) cout<<"T"<<endl;else cout<<"F"<<endl; }}return 0;
}