zoukankan      html  css  js  c++  java
  • 题解-CF364

    CF364


    CF364A Matrix

    luogu

    直接一个矩阵的和就是原串两段的和的乘积。

    可以枚举原串上的段,然后用 unordered_map 维护一下即可。

    特判 (a=0)。时间复杂度 (Theta(n^2))

    aclink


    CF364B Free Market

    luogu

    很,难啊!先考虑第一个答案:

    肯定是最大的 (i) 满足:(forall j<i:sm_j+dge a_j)

    然后考虑到第一个答案很小,可以背包出每个可以选到的价值和。

    然后有个结论:每两个和 (s_0,s_1) 只要满足 (s_0+dge s_1) 就可以交换。

    为什么呢?相当于把 (s_0-s_1) 换成 (s_1-s_0) 了。

    然后可以再 dp 一次,用一个单调队列维护,(f(s)) 表示凑成 (s) 最小步数。

    时间复杂度 (Theta(n^2 v))

    aclink


    CF364C Beautiful Set

    luogu

    因为每个用了的质数都得用一半,所以考虑尽量少用质数。打表:

    如果只用 (1) 个质数,(2) 最优,可以满足 (nle 8),并且正好满足过半要求。

    如果只用 (2) 个质数,(2,3) 最优,可以满足其余的 (nle 65),并且正好满足过半要求。

    (2,3,5)(406)(2,3,5,7)(2094)(2,3,5,7,11) 可以满足其余 (n) 在数据范围内的所有。

    然后直接分段暴力即可。

    aclink


    CF364D Ghd

    luogu

    假如已经知道了一个在选中集合中的数,直接求出别的数和它的 gcd

    然后 (Theta(d(a)^2))(max d(10^{12})=6720))求出每个 gcd 满足集合大小即可。

    所以随机化,每次随机选一个数,假设它在集合中,做 (10) 次错误率就只有 (frac{1}{1024})

    aclink


    CF364E Empty Rectangles

    luogu

    感觉思路很简单,但是好难想到啊。

    就是分治,将问题转化为求跨过中线的子矩阵数。

    比如中线是横着的,可以先枚举矩形的左边界 (l)

    然后枚举右边界 (r),依次求出 (up(l,r,k)) 表示当下边界是中线时,

    最上的上边界,满足子矩阵只有 (k) 个黑格子。(down(l,r,k)) 同理。

    因为这两个东西随右边界是单调的,所以可以 (Theta(nm)) 求出。

    然后对于每个 (l,r),贡献为 (sum ua(k)cdot da(K-k))

    其中 (ua)(k) 占的区域,可以通过 (up) 求出,(da) 同理。

    aclink


    [Huge m Let the dark corners absorb the red blood! ]

  • 相关阅读:
    Visual Studio 2008 SP1 & .NET Framework 3.5 SP1 使用感受
    体验 DreamSpark
    如何在vc 6.0下配置 opencv 1.0
    注释一个opencv摄像头程序
    Java数据库设计中的14个技巧
    DataReader的使用
    JSP是不是Java发展史上的一大败笔?
    双十一谁才是受益者?
    用JAVA中的多线程示例生产者和消费者问题
    SQL的基本操作
  • 原文地址:https://www.cnblogs.com/George1123/p/14207419.html
Copyright © 2011-2022 走看看