ios::sync_with_stdio(false); ? ? ?
快读板子???
无效???

题意描述:

大佬 LogeY 被丢到了一棵神奇的树上。为什么神奇呢,因为这棵树的每个节点都只有两个子节点!

LogeY 太强了,他想做题,但是题在这个树的根节点上,所以他需要一步一步向上走。然而,这棵树上的一些节点上放置有基佬,如果 LogeY 走到有基佬的节点上,LogeY 就会被 Gay。

LogeY 总共被丢到了树上 N 次,问每次他走到根节点的途中会不会被 Gay?


输入格式:

第一行两个整数 NM 表示树的节点数量和有基佬的节点数量。

之后的 N 行每行一个整数 $a_i$,表示有基佬的点。

之后一行一个整数 q,表示 LogeY 被丢到了树上 M 次;

之后的 q 行,每行一个整数 $b_i$

表示 LogeY 这一次被丢到了 $b_i$号点


输出格式:

输出 q 行,每行一个字符串,如果这次 LogeY 走到根节点的过程中至少被 Gay 了一次,则输出 LoGAY!,否则输出 srO lgy Orz。


Input & Output ‘s examples

Input ‘s eg

7 2
2
3
6
2
3
4
5
6
7

Output ‘s eg

LoGAY!
LoGAY!
LoGAY!
LoGAY!
LoGAY!
LoGAY!

数据范围与约定:

对于 10% 的数据,$q=0 $
对于另外 10% 的数据,$m=0 $
对于另外 10% 的数据,$m = n - 1 $
对于 30% 的数据,$n \leq 100 $
对于 60% 的数据,$n \leq 100000$
对于 100%的数据,$1 \leq n \leq 2000000, 0 \leq m \leq n - 1, 0 \leq q \leq n - 1, 2 \leq u_i, v_i \leq n$
树上节点的编号,对于 u 号节点,它的两个子节点(如果存在)编号分别为 2u2u+1
保证每个点上最多只有一个 Gay

题目分析:

这题对于可爱的Logey可能真的不太友好……(逃)

当我第一眼看到这题时,我感叹道Logey在样例中被Gay了6次这不是一道简单的二叉树嘛。

事实上,它就是一颗简单的二叉树。

我们可以定义一个bool数组tree[]表示这个结点上有没有Gay

再写一个循环来模拟Logey在树上走的过程,如果logey此刻所在节点上面有Gay,就退出循环并输出。没有则继续。

然后我就写出了以下代码:

#include<iostream>
#include<cstdio>
using namespace std;
int n, m, q;

struct node{
int name;
bool jilao;
}a[2000001];

int main(){
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
ios::sync_with_stdio(false);
a[1].name = 1;
a[1].jilao = false;
cin >> n >> m;
for(int i = 2; i <= n; i++){
a[i].name = i;
a[i].jilao = false;
}
for(int i = 1; i <= m; i++){
cin >> a[i].name;
a[a[i].name].jilao = true;
}
int c;
bool bj = false;
cin >> q;
for(int i = 1; i <= q; i++){
cin >> c;
if(a[c].jilao == true || a[c / 2].jilao == true){
cout << "LoGAY!" << endl;
continue;
}
while(c / 2 > 1){
if(a[c].jilao == true || a[c / 2].jilao == true){
bj = true;
break;
}
else{
c = c / 2;
}
}
if(bj == true){
cout << "LoGAY!" << endl;
}
else{
cout << "srO lgy Orz" << endl;
}
}
fclose(stdin);
fclose(stdout);
return 0;
}

嗯,貌似没毛病。

可是……

5jrGrB.png

5jrbmp.jpg

怎么回事???

终于,在和Herself32折腾了将近两个小时后,我发现TMD我忘了初始化变量了

于是又有了下面的代码

#include<iostream>
#include<cstdio>
using namespace std;
int n, m, q, d;
struct node{
bool jilao;
}a[2000001];

int main(){
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
ios::sync_with_stdio(false);
cin >> n >> m;
for(int i = 1; i <= m; i++){
cin >> d;
a[d].jilao = true;
}
int c;

cin >> q;
for(int i = 1; i <= q; i++){
bool bj = false;
cin >> c;
if(a[c].jilao == true || a[c / 2].jilao == true){
cout << "LoGAY!" << endl;
continue;
}
while(c != 1){
if(a[c].jilao == true || a[c / 2].jilao == true){
bj = true;
break;
}
else{
c = c / 2;
}
}
if(bj == true){
cout << "LoGAY!" << endl;
}
else{
cout << "srO lgy Orz" << endl;
}
}
fclose(stdin);
fclose(stdout);
return 0;
}

嗯,这下应该没毛病了。

可是……

5jrZKE.png

5jrrmS.png

5jraxz.png

心中一万句MMP

最后把cin & cout 全部改成 scanf & printf就过了。

(ps.在此之前作者加了各种优化,甚至用了快读板子,都没过QAQ)


附件(AC标程,反作弊已开启)

#include<iostream>
#include<cstdio>
using namespace std;
int n, m, q,d,c;
bool a[2000001];//a[]为树

int main(){
//freopen("tree.in","r",stdin);
//freopen("tree.out","w",stdout);
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; i++){
scanf("%d", &d);
a[d] = true; //标记有GAY的结点
}
scanf("%d", &q);
for(int i = 1; i <= q; i++){
bool bj = false
scanf("%d", &c);
/* if(a[c].jilao == true || a[c / 2].jilao == true){
cout << "LoGAY!" << endl;
continue;
}*/
while(c != 1){
if(a[c] == true || a[c / 2] == true){
bj = true; //如果有,标记为真并退出循环
break;
}
else{
c = c / 2; //没有就继续向上搜索
}
}
printf("%s\n", bj ? "LoGAY!" : "srO lgy Orz");
}
//fclose(stdin);
//fclose(stdout);
return 0;
}

THE END