• 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:

    待补

  • 相关阅读:
    css grid 随笔
    网页“console”输出图文信息
    2017
    自适应css 框架 PURE
    获取去除参数url地址
    微信分享
    video 播放
    手机端 默认字体
    video 手机全屏自动播放
    jquery 获取元素背景图片backgroungImage的url
  • 原文地址:https://www.cnblogs.com/lawyer/p/6790304.html
Copyright © 2020-2023  润新知