zoukankan      html  css  js  c++  java
  • CF1172

    Codeforces Round #564 (Div. 1)

    A

    最优情况一定是先打出若干张空白牌后就一直不打空白牌了。设 (pos_i)(i) 这个数在牌堆中的位置,若一张空白牌都不打就能完成则其为最优,否则答案为 (maxlimits_{i=1}^n pos_i+n-i+1),即将一张牌从牌堆移出后又将其移到对应位置上。

    还有另一种思路:

    (cnt_i) 为数字 (i) 移到其对应位置的所需次数,(pos_i<i) 时,(cnt_i=pos_i+n-i+1),否则 (cnt_i=pos_i-i)。若存在 (cnt_i) 小于当前 (cnt_i) 的最大值,说明数字 (i) 会回到手牌中,因此将其调整为 (pos_i+n-i+1)。这时若最大值发生变化则再调整一轮,最终最大值即为答案。因为答案的上界为 (2n),所以最多调整两轮。

    B

    发现对于 (x) 的每个子树,其在圆上一定是连续的一段,不然子树间就会相交。先定一个根节点,发现根节点可以排列其所有子树的顺序,不是根节点的节点可以排列其本身和所有子树的顺序,因此答案为 (nprodlimits_{i=1}^n deg_i!)

    C

    暴力就是考虑每个数,记录当前操作次数,喜欢的位置选到的次数,考虑的数选到的次数,直接 (DP) 即可。

    考虑优化,设 (s) 为总的权值和,(s_1) 为喜欢的位置的权值和,(s_2) 为不喜欢的位置的权值和,(f_v(i,j,k))(i) 次操作后,当前喜欢的位置的权值和为 (j),不喜欢的位置的权值和为 (k),某个喜欢的位置的权值 (v) 的期望值,(g_v(i,j,k)) 为某个不喜欢的位置的权值 (v) 的期望值。

    (f_v(i,j,k)=vf_1(i,j,k)),其可以通过数学归纳法证明,这里对 (i) 进行归纳。发现 (j,k) 可以用增量的形式表示,即 (f_v(m-i-j,s_1+i,s_2-j))

    转移为:

    [largeegin{aligned} f_1(i,j)&=frac{s_1+i-1}{s+i-j}f_1(i+1,j)+frac{1}{s+i-j}f_2(i+1,j)+frac{s_2-j}{s+i-j}f_1(i,j+1) \ &=frac{s_1+i+1}{s+i-j}f_1(i+1,j)+frac{s_2-j}{s+i-j}f_1(i,j+1) \ g_1(i,j)&=frac{s_2-j-1}{s+i-j}g_1(i,j+1)+frac{1}{s+i-j}g_0(i,j+1)+frac{s_1+i}{s+i-j}g_1(i+1,j) \ &=frac{s_2-j-1}{s+i-j}g_1(i,j+1)+frac{s_1+i}{s+i-j}g_1(i+1,j) end{aligned} ]

    得当 (i+j=m) 时为边界,(f_1(i,j)=g_1(i,j)=1)

    D

    满足某一行和某一列的要求后,就能把 (n imes n) 的问题转化为 ((n-1) imes (n-1)) 的问题。考虑到第 (i) 个时,找到第 (x) 行要到第 (i) 行,第 (y) 列要到第 (i) 列,若 (x,y) 都等于 (i),就不处理,否则放一对传送门 ((x,i),(i,y)),然后交换第 (x) 行和第 (i) 行的要求,交换第 (y) 列和第 (i) 列的要求即可,交换是为了接下来满足 (i) 的要求。

    E

    单独考虑每个颜色的贡献,用总路径数减去不包含某一颜色的路径数即为该颜色的贡献。

    若当前考虑到的颜色为 (c),将所有颜色为 (c) 的点看作白点,其他点为黑点,那么不包含颜色 (c) 的路径数就是所有黑色连通块大小的平方。每个黑点向父亲连边,每个黑色连通块最上面都有一个白点,也就是一个白点下面挂着一些黑色连通块。离线后用 (LCT) 维护子树大小的平方和,每次在最上面的白点查询变化量即可。

    具体来说,初始时整棵树都是黑点,然后用 (LCT) 来实现黑白点的变化和查询变化量。处理完当前颜色后,要注意把整棵树再变回都是黑点。

    F

    题目中的函数可以看作有一个值经过区间后得到一个值,设初始值为 (x),那么结果一定能表示为 (v+sum_{l,r}-xp),其中 (sum_{l,r}) 为区间和,(x) 为减去 (p) 的次数,因为随着 (v) 的增大,(x) 不会减小,因此该函数为分段函数。

    考虑线段树,在节点上维护 (c_x),其为使得在该节点对应的区间 ([l,r]) 中减去了 (xp) 的最小初始值,即为分段函数每一段的端点。

    考虑合并信息,用左区间的 (c_x) 和右区间的 (c_y) 来更新当前区间的 (c_{x+y})。为保证合法,这里要求左区间初始值的最大值 (c_{x+1}-1) 经过左区间后要大于 (c_y),即 (c_{x+1}-1+sum_{ls}-xp<c_y),然后就可以用 (max(c_x,c_y-sum_{ls}+xp)) 来更新 (c_{x+y})

    发现 (c_{x+1}-c_x geqslant p),因为 (c_x) 经过区间后不可能大于 (0),所以至少加 (p),才也可能使 (p) 的次数变多,得 (c_{x+1}-1+sum_{ls}-xp) 具有单调性,可以双指针来做。

    询问时就在分段函数上二分即可。

  • 相关阅读:
    linux下查看nginx,apache,mysql,php的编译参数
    Nginx重大漏洞,文件类型错误解析
    用C语言编写PHP扩展1(转)
    数字证书中keytool命令使用说明
    Nginx 日志文件切割
    推荐12款精心设计网站设计PSD模板
    分享9个最棒的代码片段资源网站
    强大的独立日期选择器(date picker)插件 Kalendae
    分享一个HTML5的drag and drop API实现的图片拖拽分组效果
    你真的很了解HTML标签吗? 试试这个超异类的HTML标签小测验吧!
  • 原文地址:https://www.cnblogs.com/lhm-/p/13806037.html
Copyright © 2011-2022 走看看