zoukankan      html  css  js  c++  java
  • 题解AGC056

    赛时 AC:A B C

    补题:DEF

    A (Easy)

    首先爆搜得到 \(N = 6...11\) 的答案。

    \(n\) 拆分成若干个 \([6,11]\) 的正整数 \(n_1,n_2,...,n_k\),然后把这些矩阵拼起来即可。

    aclink

    B (Medium)

    考虑如何判断一个方案是否可行:每次找到一个可能的最大值,然后按这个最大值分成两个子区间递归处理。

    考虑原问题。我们现在要计算一段区间 \([l,r]\) 满足条件的方案数:

    显然我们要找到 \(\ge 1\) 个可能的最大值,因此如果我们找到了 \(k\) 个最大值,我们乘以 \((-1)^{k-1}\) 的容斥系数,并把整个区间分成 \(k+1\) 个子区间处理。

    这个可以再加个 \(\rm DP\) 处理,时间复杂度 \(\Theta(n^3)\)

    aclink

    C (Easy+)

    \(0\) 附上 \(-1\) 的权值,\(1\) 附上 \(1\) 的权值。令 \(v_i\) 表示第 \(1\) 个到第 \(i\) 个字符的权值和。

    限制分为两种:

    1. \(|v_i - v_{i - 1}| = 1\)
    2. \(v_{L - 1} = v_R\)

    把第一种变为 \(|v_i - v_{i - 1}| \le 1\),由于差分约束不会更改奇偶性,因此一定构造出了一个合法的字典序最大的方案,反转即可得到字典序最小的方案。

    由于这里的边权 \(\ge 0\)\(\le 1\),所以可以用 \(\rm 01 \ BFS\) 优化,我偷了个懒救写了 \(\rm SPFA\)

    赛时写的东西比较奇怪,没法优化,这是赛后写的:aclink

    D (Medium+)

    瞎猜了个结论过了,不会证,咕了。

    E (Hard)

    不放计算 \(k = n - 1\) 的答案。

    枚举再每个位置放的奶酪个数 \(a_0,...,a_{n-1}\)

    再枚举从位置 \(n - 1\) 绕回到 \(0\) 的奶酪个数 \(x\)

    那么第 \(i\) 个奶酪经过的次数就是 \(b_i = x - i + \sum b_i\)

    一个奶酪不被吃的概率显然是 \(2^{-b_i}\)

    对于 \(k < n - 1\),第 \(k\) 个奶酪被吃,概率是 \(1 - 2^{-b_k}\)
    对于 \(k = n - 1\),第 \(k\) 个奶酪不被吃,概率是 \(2^{-b_k}\)

    因此把这些概率全部乘起来,可以表示成 \(\sum 2^{-ix} p_i\) 的形式,最后用等比数列计算,然后 \(\rm DP\) 就对了吗?

    其实还不对,例如 \(n = 1\) 答案算出来是 \(2\)。这部分官方题解讲的不太详细,这里仔细讲一下。

    我们分析一下奶酪行走的流程:

    首先由若干奶酪被放置后,走到了 \(n - 1\) 还没被吃掉。设有 \(r\) 个。

    \(x\) 个奶酪奶酪从 \(n - 1\) 绕回到 \(0\)(同一个奶酪绕多次算多个奶酪)

    \(x\) 个奶酪中有 \(x - r\) 个是从 \(0\) 重新回到 \(n - 1\)。给这些奶酪标记为 \(0\)

    \(x\) 个奶酪中有 \(r\) 个是从 \(0\) 走到某个位置被老鼠吃掉了。给这些奶酪标记为 \(1\)

    \(x\) 个奶酪的标记序列是一个字符串,比如 01001000001000

    被放置且走到 \(n - 1\) 后还没被吃掉的 \(r\) 个奶酪,对应的从 \(0\) 开始走的奶酪分别是:

    第一个被放的:01

    第二个被放的:001

    第三个被放的:000001

    也就是说一个奶酪是经过了若干圈(0),最后在某一圈被老鼠消灭(1)。

    但是注意到最后多出了三个无家可归的 0。而这些 0 是被要求不存在的,因为他根本没有起点。

    我们观察最后的 \(c\)0 对答案产生的什么影响:每个 0 都要求了最后剩下的那只老鼠不要把奶酪消灭,因此给答案贡献了 \(\frac{1}{2^c}\) 的系数。

    因此我们原先计算的答案事实上是真实答案的 \(\sum_{c = 0} \frac{1}{2^c} = 2\) 倍。因此最后把答案乘以 \(\frac{1}{2}\) 即可。

    aclink

    F (Medium+)

    大概是猜个结论,然后转成折线问题,转换成另一个柿子,然后再计数。

    题解比较难写,咕了。

  • 相关阅读:
    自定义Web框架
    Python四种实现单例模式的方法
    popup的简单应用举例
    前端框架之BootStrap的简单介绍
    前端之JQuery:JQuery扩展和事件
    前端之JQuery:JQuery文档操作
    前端之JQuery:JQuery属性操作
    前端之JQuery:JQuery基本语法
    MinerDB.java 数据库工具类
    MinerConstanits.java 常量类
  • 原文地址:https://www.cnblogs.com/zkyJuruo/p/15654233.html
Copyright © 2011-2022 走看看