zoukankan      html  css  js  c++  java
  • 2021/11/08 集训补题

    ljs神 Orz,再一次大比分rank1,无线接近AK。膜拜nbnbnbnbnbnbnbnbnb的ljs队长。

    T1

    Description

    有集合 \(w_{1,2,...,n}\),分到 \(k\) 个集合中,贡献是每个集合个数乘上 \(\sum w\) 的和。问总情况贡献和。

    Solution

    挺有意思的,想了1个多小时,像个sb一样。

    考虑对于一个点计算贡献,发现只需要算出每种情况所属的集合之和的和。考虑两种情况,一种是自己当一个集合,这种情况贡献是 \(\begin{Bmatrix} n-1 \\ k-1\end{Bmatrix}\)。另外一种情况是放入其它集合,这种情况贡献就是 \(\begin{Bmatrix} n-1 \\ k\end{Bmatrix}\times (n-1+k)\)

    所以直接算 \(\begin{Bmatrix} n-1 \\ k\end{Bmatrix}\)\(\begin{Bmatrix} n-1 \\ k-1\end{Bmatrix}\) 就行了。

    T2

    Description

    \(n\) 个商店,商店两两之间都只需要 \(1\) 分钟,加入在时间 \(t\) 来到商店 \(i\) ,那么需要 \(t\times a_i+b_i\) 来排队。问在 \(T\) 之前最多能到几个商店买到东西。

    Solution

    考试的时候懒得继续优化了。/kk

    不难发现加入我们选了 \((a_1,b_1),(a_2,b_2)\),那么 \((a_1,b_1)\)\((a_2,b_2)\) 之前的条件就是对于任意 \(t\) ,都存在 :

    \[(t\times a_1+b_1+1)\times a_2+b_2<(t\times a_2+b_2+1)\times a_1+b_1 \]

    \[\Rightarrow (b_1+1)\times a_2+b_2<(b_2+1)\times a_1+b_1 \]

    你发现这个东西似乎是有传递性的,所以我们就可以排序之后,相当于选一个子序列出来。这个显然可以用前缀最小值做到 \(\Theta(n^2)\)

    发现我们 \(a\not= 0\) 的时候,每次 \(t\) 必定翻倍,所以最多 \(\log T\) 此操作。\(a=0\) 的情况你发现可以直接加在后面。

    T3

    Description

    给出 \(n\),表示有一个长度为 \(n\) 的序列,每个位置可以选 \((0,2^n)\),使得每个位置的值都互不相同,使得它们的异或值不为 \(0\),求方案数对 \(1000000007\) 取模。

    \(n\le 10^7\)

    Solution

    考虑容斥,我们考虑 \(f_i\) 表示前面 \(i\) 个位置已经放好了,且互不相同,异或值为 \(0\) 的方案数。为了算 \(f_i\) 我们可以设 \(p_i\) 表示前面 \(i\) 个数互不相同的方案数,这个可以发现很好算。

    可以发现 \(f_i=p_{i-1}-f_{i-1}-(2^n-i+1)\times f_{i-2}\times (i-1)\),因为你肯定需要第 \(i\) 个位置的值等于前面 \(i-1\) 个位置的异或和,所以总方案就是 \(p_{i-1}\),然后需要减去前面异或值为 \(0\) 的情况,因为这时第 \(i\) 个位置为 \(0\)。还需要减去前面有相同的值的情况,这个时候相当于有 \(i-2\) 个异或值为 \(0\),再加上两个相同的值。最后答案就是 \(p_i-f_i\)

    似乎有其他的容斥做法,但我推不动。

    T4

    Description

    有一个 \(n\) 个点的图,给每个点分配一个 \(t_i\),当 \(u,v\) 有边相连的时候会产生 \(t_u\times t_v\) 的贡献,问贡献最大值。

    \(n\le 40\)

    Solution

    考虑 \(u,v\) 之间没有边的时候,我们设 \(s_u,s_v\) 表示与 \(u,v\) 相连的 \(t\) 之和,那么 \(u,v\) 产生的贡献之和就是 \((s_u\times t_u+s_v\times t_v)/2\)

    考虑到,我们可以把 \(s\) 较小的 \(t\) 移到 \(s\) 较大的 \(t\) 上面去,这样的话答案一定不会变小。也就是说,没有边的两个点之间一定有一个 \(t=0\),换句话说,只有两个点都有值当且仅当两个点之间有边。

    假设我们现在在考虑一个团大小为 \(k\),那么我们发现平均分配一定最优(均值不等式可以证明),这个时候贡献就是 \(x^2\times (1-1/k)/2\)。你发现最优情况一定是把 \(x\) 放到最大团上面。

    找最大团大小可以用 meet in the middle 做到 \(\Theta(2^{n/2}n)\)

  • 相关阅读:
    贪心法解活动安排问题
    求两个等长的已排序数组的中位数(《算法导论》P113习题9.3-8)
    0-1背包问题
    动态规划法解最长公共子序列问题
    动态规划法解矩阵链乘问题
    常见的算法设计策略
    A*算法与8数字谜题(参见《算法》P226习题2.5.32)
    keepalive+redis 主从高可用
    sharding-jdbc 读写分离+水平分表
    hash一致算法原理
  • 原文地址:https://www.cnblogs.com/Dark-Romance/p/15525040.html
Copyright © 2011-2022 走看看