生活在树上——始终热爱大地——升上天空。
给你一棵有 n 个节点的树,树上的每一个节点处都有一个字符 c,为 "(" 或 ")" 。一共有 q 次询问,每次询问树上从 u 到 v 有向的简单路径中所有节点构成的字符串 s 是否是好的。
树上的一条从 u 到 v 有向的简单路径是指由一条由树上许多条连续的边组成的路径,第一条边从 u 出发,最后一条边到达 v,并且该路径只经过树上每个点最多一次。
定义这样的一个只由字符 "(" 和 ")" 组成字符串 s 是好的:
- 开始时,你在 s 的第一个字符上,结束时,你必须站在 s 的最后一个字符上。
- 在每一个时刻你可以向左移动一个空格(如果你没有站在第一个字符上),或向右移动一个空格(如果你没有站在最后一个字符上)。你不能停留在同一个地方,但可以访问任何字符,包括第一个和最后一个字符,访问次数不限。
- 在每个时间点,你都要写下当前所站的字符。如果存在某种移动序列,能让你从第一个字符走到最后一个字符,从而使你写下的字符串是一个匹配的括号序列,那么我们就说这个字符串 s 是好的。
所谓匹配的括号序列,是指可以通过在序列的原始字符之间插入字符 "1" 和 "+",将其转换为正确算术表达式的括号序列。例如,括号序列 "()()"、"(())" 就是匹配的括号序列(得到的表达式为"(1)+(1)"、"((1+1)+1)"),而 ")(" 和 "(" 则不是。
例如,字符串 "()(())))" 是好的,因为在每个时刻,你可以按照 [1,2,3,4,3,4,5,6,7,8],这样的顺序在字符串上移动,最终的序列为 "()(((())))",是一个匹配的括号序列。
而字符串 "())(()()(())" 就不是好的,可以确定的是,在每个时刻不论你如何再这个字符串上移动,都不可能得到一个匹配的括号序列。
本题是强制在线的,这也就意味着,你必须在回答完一次询问后,下一次询问才会给出。在你回答完每个询问后,你会读取到两个整数 u,v,代表着下一次询问。在回答每个询问后,不要忘记刷新缓冲区,不然,你会得到 Idleness limit exceeded 或者 Time limit exceeded,为了避免这一点,请使用:
- C++ 中的 fflush(stdout) 或 cout.flush();
- Java 中的 System.out.flush();
- Pascal 中的 flush(output);
- Python 中的 stdout.flush();
- 其他语言请参见文档。