AGC055

第一次打AGC,好难受。

T1 看了一眼题解,没看懂……但是还是做出来了。

T2 感觉比 T1 简单,构造很好猜。

其他的没时间思考,T1 花了我 2h30min,难受。

A.ABC Identity


翻译

给定长度为 \(3n\) 的序列,其中字母 ABC 各有 \(n\) 个。

一个合法序列 \(T\) 满足以下条件:

  • 其长度为 \(3k (1 \le k \le n)\)。

  • \(T_1 = T_2 = ... = T_k\)

  • \(T_{k + 1} = T_{k + 2} = ... = T_{2k}\)

  • \(T_{2k + 1} = T_{2k + 2} = ... = T_{3k}\)

  • \(T_1, T_{k + 1}, T_{2k + 1}\) 互不相同。

求一个把这个序列分成不多于 \(6\) 个合法的序列的方案。

可以证明,一定存在一种合法的划分。


分三段考虑。

std 做法是关于 ABC 的 6 种排列,依次枚举,贪心选择。

我在考场上是:先考虑前两半,相异配对,网络流解决。

不会产生相同配对的正确性?由于是相异配对,如果产生相同配对,则某一个一定超过了 \(n\) 个,不符合题意。所以网络流可以解决,贪心选择没问题。

网络流只有 \(6 + 2\) 个点,所以可以看作常数,复杂度 + O(1)

所以整体复杂度 \(O(n)\)

妈的,傻逼网络流,真的服……

B.ABC Supremacy

考虑如下转化:

\[A \overline{ABC} \to \overline{ABC} A \\
B \overline{ABC} \to \overline{ABC} B \\
C \overline{ABC} \to \overline{ABC} C
\]

也就是我们贪心把所有的 \(\overline{ABC}\) 放在最前面即可。(相当于删除)

由于拼接后也可能存在 \(\overline{ABC}\),所以利用栈的思想处理。

复杂度 \(O(n)\)。

C.Weird LIS

方法1:组合

参考 AGC055C - Legitimity 的博客 - 洛谷博客 和补充 题解:AGC55C Weird LIS - Edward1002001 的博客 - 洛谷博客

这里再做一点说明。

  • 无用点为什么不可连续?考虑 4 3 5 2 1 7 6,也就是 非 非 必 无 无 非 非。这个排列和 2 1 3 7 6 5 4 ,也就是 非 非 必 非 非 非 非 是等价的。也就是说,连续的 会使得我们重复计数。所以不可以连续。

  • ans 初始设置?其实枚举的是没有必经点的情况(全是非必经点),需要满足:

    • \(k \le \lfloor \frac n2 \rfloor\)

    • \(k \le m\)

    • \(k \ge 2\)

    所以才有 \(\min(m, \lfloor \frac n2 \rfloor) - 1\)。但是我们还需要考虑当 \(m = n - 1\) 时,可以存在全是必经点的情况,也就是 1 2 3 ... n 的情况。

  • 为什么 \(\min(m, x + y) - \max(x, 3) + 1\)?这里枚举的是 \(k\),\(k\) 的下界确定了,因为存在 \(k - 1\),所以 \(k - 1 \ge 2 \iff k \ge 3\)。

其他部分最终式子为:

\[\sum_{x = 1}^{\min(m, n - 1)} \sum_{y = 0}^{\lfloor \frac {n - x}2 \rfloor}
{x + y \choose x} {x + 1 \choose n - x - 2y} (\min(m, x + y) - \max(x, 3) + 1)
\]

方法2:自动机

参考 at_agc055_c Weird LIS 题解 - juruo - 洛谷博客

这里做一点解释:

  • 状态机的设定,4种状态:

    1. 除了 CAN,都能放

    2. 只能放 CAN

    3. 可以放 MUST 或者 USELESS,之后 MUST 还可以跟 MAY

    4. 可以放 MUST 或者 USELESS,之后 MUST 不可以跟 MAY

  • 为什么有状态4?因为 k 确定了红黑对的数量,而我们是贪心的把所有红黑对尽可能放在前面。而可能存在只有 非 非 无 必 的情况,所以有状态 3,通过 MUST 转移到 1,通过 USELESS 转移到 4,但是不能再来一个 MAY

D.ABC Ultimatum

一道猜结论的题。

观察三个串,有 ABCBCACAB,我们考察能划分成这三种串的串的性质。

考虑每一个字母出现的次数:由于 B 只在 BCA 中在 A 前面,其他的类似。我们考虑定义 \(M_B = \max S_B - S_A\),其他的类似。

可以发现,\(M_B \le C_{BCA}\),同理,得到 \(M_A + M_B + M_C \le C_{ABC} + C_{BCA} + C_{CAB} = N\)。

这是必要条件,所以考虑证明充分性(不会。

所以我们可以设出一个 \(O(n^7)\) 的 DP,令 \(f_{a, b, c, x, y, z}\) 表示 ABC 的数量以及 \(M_A, M_B, M_C\)。

不过考虑 \(a + b + c = i\) 的时候才有贡献,所以可以省一维,变为 \(O(n^6)\)。

E.Set Merging

神仙思路题。

我们把整个序列看作一个排列,每一次的合并相当于交换排列中的两个位置。

而最终 \(S_i \to [ \min_{j = i}^n P_j, \max_{j = 1}^i P_j]\),一个后缀 \(\min\) 和一个前缀 \(\max\)。

考虑归纳法,分 \(P_i > P_{i + 1}\) 或者 \(P_i < P_{i + 1}\) 讨论。

最终就是求合法序列的最小逆序对数。考虑贪心放置,用数状数组求。

总复杂度 \(O(n + n \log n)\),可以通过6指针的方法优化到 \(O(n + n)\)。

随机推荐

  1. 面试题45(Java)-把数组排成最小的数(中等)

    题目: 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个. 示例 1: 输入: [10,2] 输出: "102" 示例 2: 输入: [ ...

  2. 阿里巴巴大规模应用Flink的踩坑经验:如何大幅降低 HDFS 压力?

    众所周知 Flink 是当前广泛使用的计算引擎,Flink 使用 checkpoint 机制进行容错处理[1],Flink 的 checkpoint 会将状态快照备份到分布式存储系统,供后续恢复使用. ...

  3. Nacos2.0的K8s服务发现生态应用及规划

    ​简介:Nacos 是阿里巴巴于 2018 年开源的注册中心及配置中心产品,帮助用户的分布式微服务应用进行服务发现和配置管理功能.随着 Nacos2.0 版本的发布,在性能和扩展性上取得较大突破后,社 ...

  4. 阿里云张振尧:阿里云边缘云驱动5G时代行业新价值

    ​简介:近日,以"5G融合通信趋势下的技术创新"为主题的2021中国增值电信及虚拟运营高峰论坛在北京召开,阿里云边缘云高级产品专家张振尧发表了<阿里云边缘云驱动5G时代行业新 ...

  5. [FAQ] ErrorException of l5-swagger:generate, Required @OA\Info() not found

    l5-swagger 除了要添加 @OA\Get() 针对方法的注释之外,每个 Controller 还需要一个概述信息,如下: /** * @OA\Info( * title="Auth ...

  6. [Caddy2] cloudflare, acme: cleaning up failed: no memory of presenting a DNS record

    使用 cloudflare 做为 DNS 之后,使用 Caddy 申请 Lets Encrypt 证书. 有时在日志里会发现一系列的提示信息: acme: use dns-01 solver acme ...

  7. 超级好用的 HBase GUI 工具分享

    超级好用的 HBase GUI 工具分享 你是否曾为 HBase 数据管理而苦恼?别担心,这一款超级好用的 HBase GUI (HBase Assistant)工具,让您在大数据世界中游刃有余.不再 ...

  8. 【进阶篇】基于 Redis 实现分布式锁的全过程

    目录 前言 一.关于分布式锁 二.RedLock 红锁(不推荐) 三.基于 setIfAbsent() 方法 四.使用示例 4.1RedLock 使用 4.2setIfAbsent() 方法使用 五. ...

  9. Java中的多态、抽象类和接口简述

    1. 引言 本文对Java编程中的多态.抽象类和接口概念进行了简明扼要的讲解,并对extends和implements进行了辨析. 2. 多态 多态是指所调用的方法只有在运行的时候才可以明确,如下例所 ...

  10. vue特殊attribute-key

    官方说明:如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地复用相同类型元素的算法.而使用 key 时,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在 ...