首页 > 代码库 > World CodeSprint 10
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:
待补
World CodeSprint 10