Codeforces Round #223 (Div. 1)

题目:http://codeforces.com/contest/380

A:

由于询问是单调的,直接顺着枚举每个区间即可。

B:

题意: 给你个高度为n的树,高度为1的节点有1个,标号为1,然后按照规律生成节点,标号为2的幂次的结点有左右儿子,其他的只有右儿子,生成高度为n的树。

有两种操作,第一种在高度为 t 的标号为 l ~ r 的节点加入值x, 第二种询问高度为 t 的标号为v的节点的子树里的不同值有多少个。

思路: 对于每个插入操作直接插入在t层,对于每个询问,枚举 t 层到第n层,维护当前层覆盖的l , r ,判断和当前层插入的是否有交即可。

Code_B

C:

思路:线段树,对于每个区间维护三个值,左边的右括号数、合法的括号对数、右边的左括号数,两个区间合并的话,左边区间的左括号和右边区间的右括号匹配,然后也是维护下三个值。

Code_C

D:

题意:电影院里有n个连排座位,每个座位两边有两个放东西的位置,也就是说总共有n+1个放东西的位置。陆续有人来坐下,如果有人来了两边的放东西的位置都要与别人分享,也就是说两边都有人了,那他就不开心了。。。现在告诉每个位置是第几个人来的,问让所有来的人都开心的方案数有多少种。

思路:对于每个位置都不确定的话,方案数就是2^(n-1) ,否则,将每个已知来的人的顺序排个序,可以知道合法方案的每个时刻的状态位置占有情况肯定是连续的一段被占有的。所以可以很容易想到,对于第一个确定位置的人来说,如果他不是第一个人,假设为第x个人,那么他肯定是前x个人的连续区间的最左边或者最右边,确定了一种后接下来的人加进来后的区间也都是确定的了,直接递归统计就可以,只需要计算两种情况——第一个人在前x个人的最左边、在最右边。

Code_D

Codeforces Round #223 (Div. 1)

上一篇:网络编程中接受缓冲的ringbuf的简单实现


下一篇:Control.PointToScreen(Point p)&&Control.PointToClient(Point p)