zoukankan      html  css  js  c++  java
  • Codeforces Round #737 (Div. 2)

    比赛链接 - Codeforces Round #737 (Div. 2)

    A. Ezzat and Two Subsequences

    (a_1, a_2, dots, a_{n-1})一组,(a_n)一组。

    B. Moamen and k-subarrays

    首先,原数组要能被分成(k)个非降子数组。

    其次,每个子数组内元素的排名要连续。

    遍历一下就完事了。

    C. Moamen and XOR

    难度突然上升,DP+组合数学。

    回顾一下,与操作时全1为1,异或操作是奇数个1为1。

    然后将每个数都当作(k)位二进制数,从高位开始DP,记(dp_{i, 0})表示考虑前(i)位时等式两边相等的方案数,(dp_{i, 1})表示考虑前(i)位时左式子大于右式的方案数。

    两边相等

    必定是前(i - 1)位相等,然后第(i)位相等。

    (i)位相等共有两种情况:同为0和同为1。

    同为0的话,相当于第(i)位需要有偶数个1;同为1需要第(i)位全为1且(n)为奇数。共(f = [ ext{n is odd}] + sum_{k} [ ext{k is even}]C_n^k)种方案。

    然后就有(dp_{i, 0} = dp_{i - 1, 0} imes f)

    左大于右

    (i - 1)位相等且第(i)位左大与右或者前(i-1)位大且第(i)位随意。

    (i)位左大于右当且仅当(n)为偶数且全为1。

    然后就有(dp_{i, 1} = dp_{i - 1, 0} [ ext{n is even}] + dp_{i-1,1} imes 2^k)

    最后

    (ans = dp_{n, 0} + dp_{n, 1})

    D. Ezzat and Grid

    考虑动态规划+线段树。

    首先,记(dp_{i, j})为考虑前(i)行,第(i)行通过第(j)列和之前的列保持满足条件,最多能保留几行。那么就有

    [dp_{i, j} = left{ egin{aligned} & 1 + max_{a_{i-1, j} = 1}(dp_{i - 1, j}) & a_{i, j} = 1\ & dp_{i -1, j} & a_{i, j} = 0 \ end{aligned} ight. ]

    然后每次都只和上一行有关,所以可以滚动数组优化空间。

    然后通过离散化可以把行数缩成(O(m))级别,然后一个线段树区间最大值就解决了。

    由于要输出方案,所以可以加个区间置数或者以{value, index}作为线段树的元素,然后维护每一行的最优的前驱就行了。

    AC代码

    传送门

    写在最后

    补8.11 -8.13

  • 相关阅读:
    动态规划——Best Time to Buy and Sell Stock IV
    动态规划——Split Array Largest Sum
    动态规划——Burst Ballons
    动态规划——Best Time to Buy and Sell Stock III
    动态规划——Edit Distance
    动态规划——Longest Valid Parentheses
    动态规划——Valid Permutations for DI Sequence
    构建之法阅读笔记05
    构建之法阅读笔记04
    构建之法阅读笔记03
  • 原文地址:https://www.cnblogs.com/zengzk/p/15139623.html
Copyright © 2011-2022 走看看