zoukankan      html  css  js  c++  java
  • 2021-4-1考试

    2021-4-1

    考试第一题写了15分暴力,第二题写正解,第三题写41分暴力。最终第一题15->3,第二题100->95,不过好像没差多少。。

    下午似乎把第一题想出来了。晚上讲插头dp。

    2021-4-1 异或

    题意

    给出 (n) 个数,问有多少个子集(可重)满足这个子集不存在两个数满足 (a ext{xor} b< x)(x) 给定。

    题解

    我自己想的办法

    考虑给他建立一个 trie,然后从根开始往下看。如果根节点与两个儿子形成的边代表的位比 (x) 的最高位还要大,那么左右儿子其实是独立的。因为两个数如果来自两边,那么一定不会违反规则。所以根节点子树内选的方案数就是两个儿子的方案数的乘积。

    如果根节点与儿子之间的边没有 (x) 的最高位大(即一样或者小),并且 (x) 的这一位是 1,那么一定只能在左子树里选一个,右子树里选一个。如果某棵子树选了两个,那么一定不符合条件,因为肯定比 (x) 小了。具体对于左边一个数,顺着右边的儿子枚举是在哪一位开始比 (x) 大或者与 (x) 相等就行了。复杂度应该是 (nlog_2n) 左右?

    如果 (x) 这意味是 0 ,那么左边和右边随便选就行了,注意左边和右边都可以不选。

    题解的办法

    假设 (x) 一共有 (i) 位,那么将每个数的后 (i) 位去掉,并按照剩下的位分组。可以发现,同一组的数最多选 0 或 1 或 2 个,因为在 (x) 的最高位那一位上同一组内的所有数必须不同。

    总结

    关键点在于考虑到不同块之间的独立性,这需要多尝试,没有什么别的办法。大概感觉到不能选太多数,要不然会有两个数异或起来很小。

    2021-4-1 计数

    题意

    求所有长度为 (n) ,每个位置上的数可以是 ([1,k]) 中的整数的序列,(max{L(a)-x,0}) 的和。其中 (x) 是一个给定的常数。

    其中 (L(a)) 表示这个序列是 (a) ,他的最长连续相同段的长度是多少。

    题解

    考虑计算 (max{L(a)-x,0}ge a) 的序列数量。也就是计算 (L(a)ge x+a) 的排列数量。可以先枚举一共有多少段,再枚举有多少个 (L(a) ge x+a) 的段,来一个容斥就行了。

    然后可以列出来算式,算式有一块是:

    [inom{n}{m-1}inom{m}{i} ]

    可以考虑给第二块拆开,然后就变成:

    [inom{n}{m}inom{m}{k} ]

    直接使用一波组合恒等式:

    [inom{n}{k}inom{n-k}{m-k} ]

    会发现有一块是二项式定理,给他算出来,就可以 (mathcal O(nln n)) 计算结果了。

    总结

    直接做就完了,没有好总结的。

  • 相关阅读:
    85. Maximal Rectangle
    120. Triangle
    72. Edit Distance
    39. Combination Sum
    44. Wildcard Matching
    138. Copy List with Random Pointer
    91. Decode Ways
    142. Linked List Cycle II
    异或的性质及应用
    64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/YouthRhythms/p/14607892.html
Copyright © 2011-2022 走看看