zoukankan      html  css  js  c++  java
  • CodeChef 2020 August Long Challenge 题解

    由于人菜,还是 Div.2。

    要掉分了 /dk

    CHEFWARS

    模拟。

    LINCHESS

    模拟。合法当且仅当是 (k) 的约数。

    CRDGAME3

    模拟。最小位数显然是 (lceilfrac{n}{9} ceil)

    SKMP

    先把 (T)(S) 中去掉,容易发现剩下的字母和对应出现次数是固定的。

    显然把它们排序最优,然后再选一个位置把 (T) 插进去。

    容易发现,若插进去的位置左边有大于 (T_1) 的字母肯定不优,右边有小于 (T_1) 的字母肯定不优。

    又容易发现,最优解中要么所有等于 (T_1) 的字母都在插进去的位置左边,要么都在右边。

    两者比较一下即可。

    时间复杂度 (O(n))

    CHEFWED

    简单 dp。过于显然不说了。

    时间复杂度 (O(n^2)) 或者更优。

    SUBSFREQ

    计数学傻了差点不会做 /kk

    先开桶,设 (i) 出现了 (cnt_i) 次。那么有:

    [ans_i=sum_{j=1}^{cnt_i}inom{cnt_i}{j}(prod_{k=1}^{i-1}sum_{l=0}^{j-1}inom{cnt_k}{l})(prod_{k=i+1}^nsum_{l=0}^jinom{cnt_k}{l}) ]

    注意到 (sum cnt_i=n),所以直接暴力枚举 (j),如果内层复杂度够优是可以的。

    下面以内层第一个括号为例。可能有些加减一的细节,不管了。

    时时刻刻维护一个 (p_j) 表示括号内的值。那么当加入 (i-1)(此时枚举到 (i))的时候:

    (j)(0) 枚举到 (cnt_k),对这一部分的 (p_j) 暴力修改,就是乘上个组合数的前缀和。总共暴力的次数也是 (O(sum cnt_i)=O(n))

    对于 (j>cnt_k) 的部分,注意到此时组合数的前缀和不会再变了((inom{cnt_k}{j}=0)),所以是后缀乘上一个定值。

    用线段树或树状数组维护。

    时间复杂度 (O(nlog n))

    ACCBIP

    不同颜色的显然独立(最后用个背包合并就行了),单独考虑每种颜色。

    选三条线,能组成三角形,当且仅当斜率不同。

    按斜率分类,设一共 (m) 类,每类有 (cnt_i) 个。接下来 (x) 次操作,每次可以选一个非零数减去一,问最后所有无序三元组乘积和的最小值。

    每次选择最小的数减一。感受一下很对,证一下也很对。

    然而没写 /kk

    CHEFCOMP

    无智商选手的泪水……

    我们倒序考虑删点的操作,变成加点。

    建一棵新树。每加入一个点,考虑它周围已经被解放的连通块,把那些连通块对应的子树的根的父亲都设为它。

    最后就可以发现,每次操作是在新树上的子树减。

    一个点的答案,就是从根到它的路径上,选最短的前缀使它变为非正数。随便搞。

    时间复杂度 (O(nlog n))

    ANTS

    什么都不会。

  • 相关阅读:
    java数据结构之队列
    java数据结构之线性表
    habase 报错 ERROR: Can't get master address from ZooKeeper; znode data == null
    java.io.IOException: Could not find status of job:job_1534233312603_0002
    windows本地调试安装hadoop(idea) : ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path
    搭建hadoop_之 创建3个虚拟机配置好网络
    java 数组
    java 中break 和continue 的非常规用法
    java运算符
    java数据类型
  • 原文地址:https://www.cnblogs.com/1000Suns/p/13458404.html
Copyright © 2011-2022 走看看