ios::sync_with_stdio(false); ? ? ? 快读板子??? 无效???
题意描述: 大佬 LogeY 被丢到了一棵神奇的树上。为什么神奇呢,因为这棵树的每个节点都只有两个子节点!
LogeY 太强了,他想做题,但是题在这个树的根节点上,所以他需要一步一步向上走。然而,这棵树上的一些节点上放置有基佬,如果 LogeY 走到有基佬的节点上,LogeY 就会被 Gay。
LogeY 总共被丢到了树上 N 次,问每次他走到根节点的途中会不会被 Gay?
输入格式: 第一行两个整数 N 、M 表示树的节点数量和有基佬的节点数量。
之后的 N 行每行一个整数 $a_i$,表示有基佬的点。
之后一行一个整数 q ,表示 LogeY 被丢到了树上 M 次;
之后的 q 行,每行一个整数 $b_i$
表示 LogeY 这一次被丢到了 $b_i$号点
输出格式: 输出 q 行,每行一个字符串,如果这次 LogeY 走到根节点的过程中至少被 Gay 了一次,则输出 LoGAY!,否则输出 srO lgy Orz。
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 号节点,它的两个子节点(如果存在)编号分别为 2u 和 2u+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 ; }
嗯,貌似没毛病。
可是……
怎么回事???
终于,在和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 ; }
嗯,这下应该没毛病了。
可是……
心中一万句MMP
最后把cin & cout 全部改成 scanf & printf就过了。
(ps.在此之前作者加了各种优化,甚至用了快读板子,都没过QAQ)
附件(AC标程,反作弊已开启) #include <iostream> #include <cstdio> using namespace std ;int n, m, q,d,c;bool a[2000001 ];int main () { scanf ("%d %d" , &n, &m); for (int i = 1 ; i <= m; i++){ scanf ("%d" , &d); a[d] = true ; } scanf ("%d" , &q); for (int i = 1 ; i <= q; i++){ bool bj = false ; scanf ("%d" , &c); 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" ); } return 0 ; }
THE END