World CodeSprint 10

 C:

题意:

给定一个长度为 $n$ 的序列 $a_i$,从 $a$ 序列中选出一个大小为 $k$ 的子序列使得子序列数字的  bitwise AND 值最大。

求问最大值是多少,并求出有多少个最大值序列。

 

解法:

从高位向低位枚举 bitwise AND 的二进制位,每一次优先让当前 bitwise AND 的最高位为1,如果可行则让此位为1 。

考虑已知一个 bitwise AND 的前缀 $S$,求解满足子序列 bitwise AND 前几位等于 $S$ 的方案数,只要求出所有的

$a_i \  AND \  S = S$,然后组合数一下即可。

$O(n * log(ans))$

 

D:

题意:

给定一棵 $n$ 个节点的树,每一个节点有一个权值 $a_i$(有正有负),现在从树上找出两个互不相交的联通点集 $A,B$,使得

$(\sum{A_i}) \cdot (\sum{B_i}) $ 最大。

 

解法:

可以注意到,答案一定是选取一条边,分别求这条边两侧的最大联通子图,然后相乘的结果。

考虑树形dp,

$f(i,0)$ 表示考虑 $i$ 的子树内的点,最大的联通子图点权和

$f(i,1)$ 表示考虑 $i$ 的子树内的点,包括点 $i$ 的最大的联通子图点权和

$f(x,1) = \sum_{<x,p>∈E} {max ( f(p,1), 0 ) } + a_x$

$f(x,0) = max \{ 0, f(x,1) ,  f(p, 0) \}, (<x,p>∈E)$

首先将1作为 root,dfs一遍得到以1 为根的树的 $f$ 值,然后考虑root 在树上移动,每移动一次改变两个点的 $f$值。

$ans = max \{ f(p_1,0) * f(p_2,0), f(p,0) * [f(root,1) -  max(f(p,1), 0) ] \}$

$O(n)$

 

E:

题意:

求问有多少个1~n的排列 $p$ ,满足 $p_{i} < p_{i+1}$ 或 $p_{i} < p_{i-1}$ 的人数至少有 $K$ 个。

多组询问。

 

解法:

考虑dp,$f(i,j)$ 表示 1~i 的排列有多少个有 $j$ 个不满足条件的$p_i$。

注意到不满足条件的位置一定不相邻,这样

$f(i+1,j) += f(i,j) \cdot (2j)$

$f(i+1,j+1) += f(i,j) \cdot (i+1-2j)$

求一下前缀和即可。

$O(n^2 + K)$

 

F:

题意:

给定平面上$n$个位置不同的点,保证不存在三点共线,给定一棵树,建立一中树的节点和平面上点的对应关系,

使得将在树上存在边的点用线段连起来后 不存在线段在非给定节点交叉的情况。

 

解法:

考虑极角排序,每一次选择左下角的点,并且按照极角对于其他店进行划分。

$O(n^2 logn)$

 

G:

待补

posted @ 2017-04-30 20:29  lawyer'  阅读(235)  评论(0编辑  收藏  举报