AtCoder AGC002 简要题解
从今天开始,联赛之前大约要完成前 \(20\) 套 \(\rm AGC\),希望不要鸽。
A
略
B
感觉这题比 \(\rm C\) 题难。
考虑对于每个时刻维护每个位置是否可能出现红球,那么一个时刻一条边只会影响到两个位置。
那么一路维护过来即可,复杂度 \(\mathcal{O}(n)\)。
C
显然最终一定会存在一个时刻使得有一对相邻点 \((i, i + 1)\) 所在的绳子上只存在 \((i, i + 1)\) 之间这一条边。
那么原问题存在一组解的必要条件就是 \(\max\limits_{i = 1} ^ {n - 1} a_i + a_{i + 1} \ge L\)。
然后我们令满足上述条件的一个位置为 \(x\),那么只需要把 \(x\) 左侧的绳结从左至右依次删除,然后再从右往左把 \(x\) 右侧的绳结依次删除最后删 \(x\) 即可。
那么上面哪个必要条件就是充要条件,构造可以按照上述方法构造。
D
我只会两个 \(\log\) 的做法,然后赛后补题解发现可以一个 \(\log\)。
两个 \(\log\) 的话有两种做法:
二分答案,考虑如何 \(\rm check\)。
考虑建出 \(\rm Kruskal\) 重构树,在树上倍增讨论一下就可以得到可以到达的点数了。
直接整体二分,显然一次询问可以用并查集解决。
整体二分的时候考虑先把左区间的边加上,然后先递归右区间,右区间递归完上来之后用可撤销并查集撤销左区间的边然后递归左区间。
一个 \(\log\) 个的话考虑离线二分。
这样子就不需要支持可撤销了,那么复杂度就是 \(\mathcal{O}(n \alpha(n) \log n)\)。
E
貌似毫无思路,不妨尝试寻找一些性质:
- 假设操作一选择了 \(x\) 个元素,那么这 \(x\) 个元素不会因为操作而改变,一定会是最大的前 \(x\) 个元素(有相同的随便取)。
因此,有效的局面本质上很少,因为我们只关心当前做了几次操作一还是操作二,不论顺序如何最终局面相同。
分析一下上界,不难发现为:\(\mathcal{O}(\sum a_i)\),考虑进一步优化这个做法。
根据转移的特性,我们不妨将问题转化为如下模型:
首先将所有元素从大至小排序,然后将其抽象为 \(n\) 个由 \(1 \times 1\) 方格构成的柱子,那么双方的一种决策路径可以看作是 左下角每次向右或向上走到边界的过程, 如下图所示(图蒯的官方的)。
那么我们手玩一下每个点的胜负性可以发现,这个格点图上 边界全为必胜,\(x + y\) 对角线上的格点胜负性相同。
其中 O
表示必胜格点,X
表示必败节点。
有了这个性质我们就可以利用左下角所在对角线上的任意元素确定最终初始局面的胜负性了。
不难发现可以选取所在对角线最靠右在碰到边界前的第最后一个格点,这样就只用关心该点到上面,右边第一个边界的距离的奇偶性了:只要存在一个距离为奇数那么就必胜否则必败(就像下图所示)。
复杂度 \(\mathcal{O}(n \log n)\),瓶颈在于排序。
F
下文颜色种类数为 \(m\),每种颜色有 \(n\) 个球。
考虑什么样的序列是合法的,当且仅当对于每个前缀出现的有颜色的球的种类数不大于白色球的数量。
由于每种球之间有标号,而每种球内部之间无标号,因此这本质上是一个类排列计数问题。
难处理的地方在于所有颜色第一个出现的球的位置需要被染成白色,而白色内部也是无标号的。
常见的方法是我们考虑将合法序列和没有染白色的序列构造一种双射,来计算在某种要求之下的没有染白色的序列。
下文称没有被染成白色的序列为原始序列。
不难发现可以将合法序列的每个白色球归进其后面第一个之前没有归进其他白色球且最靠前的颜色。
容易证明这样可以构成双射。
考虑将这个对原始序列的限制进行转化,我们将白色球的位置和它归入的颜色中最靠前的球连边。
不难发现这样的连边不存在包含关系,只存在相离或相交关系。
那么对应原始序列就相当于对每种颜色第一次出现的位置和第二次出现的位置的要求:
- 将每种颜色第一次出现的位置依次写下记为 \(A\),第二次出现的位置依次写下记为 \(B\),那么这样的原始序列合法当且仅当 \(A, B\) 离散化之后的序列完全相同!
有了这个性质之后我们不难得到一个暴力 \(\rm dp\),我们钦定按照每种颜色第一次出现的顺序来插入每种元素。
那么可以考虑每次往当前得到的序列当中插入一种新的颜色(\(n\) 个球一次性插入),只需要保证第一个位置再上一种颜色第一个位置之后,第二个位置在上一种颜色第二个位置之后即可。
于是可以令 \(f_{i, j, k}\) 表示当前考虑到第 \(i\) 中颜色,当前颜色第一个出现的位置在 \(j\),第二次出现的位置在 \(k(j < k)\) 的方案,那么不难得到转移:
\]
使用前缀和优化,复杂度 \(\mathcal{O}(n ^ 2m ^ 3)\),状态优化不下去,考虑换一种 \(\rm dp\) 方式。
注意到我们只关注每种颜色第一个位置和第二个位置的相对位置,而两者的关联性并不大,于是可以考虑将每种元素第一个位置的决策和第二个位置的决策分开考虑,这样就能降下维度了。
于此同时,我们现在考虑先不急着将白球归入某种颜色,等到后面加入了某种没有匹配白球的颜色时再将最前面的白球归入该种颜色,这样依然满足双射的构造。
由于我们不能记录序列中白球的位置,那么就可以考虑直接在 \(n \times m\) 个空位中填数,这样如果按照钦定的颜色第一次 / 第二次出现顺序插入,就只需要保证每次插入的白球 / 颜色段的第一个元素在当前的第一个空位即可。
于是可以直接令 \(f_{i, j}\) 表示当前已经插入了 \(i\) 个白球,\(j(i \ge j)\) 个颜色段的方案,那么有转移:
\]
线性预处理阶乘及其逆元,复杂度 \(\mathcal{O}(nm)\)。
AtCoder AGC002 简要题解的更多相关文章
- AtCoder ABC213 简要题解
这世道连 \(\rm ABC\) 都要写题解来续命了... A - D 略. E 有如下观察: 对于任意的四个方格,出去之后再回来可以调整为先在内部走到固定位置再走出去. 因此只需要考虑在一开始把内部 ...
- AtCoder AGC003 简要题解
A 首先横向和纵向互相独立,因此只考虑横向的情况. 那么显然只要不只往一边走都一定存在一种构造方式,直接判断即可,复杂度 \(\mathcal{O}(|S|)\). B 首先相邻两个数同时配对两次可以 ...
- AtCoder ExaWizards 2019 简要题解
AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...
- Noip 2014酱油记+简要题解
好吧,day2T1把d默认为1也是醉了,现在只能期待数据弱然后怒卡一等线吧QAQ Day0 第一次下午出发啊真是不错,才2小时左右就到了233,在车上把sao和fate补掉就到了= = 然后到宾馆之后 ...
- Tsinghua 2018 DSA PA2简要题解
反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...
- Codeforces 863 简要题解
文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 简要题解?因为最后一题太毒不想写了所以其实是部分题解... A题 传送门 题意简述:给你一个数,问你能不能通过加前导000使其成为一个回文数 ...
- HNOI2018简要题解
HNOI2018简要题解 D1T1 寻宝游戏 题意 某大学每年都会有一次 Mystery Hunt 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为 ...
- JXOI2018简要题解
JXOI2018简要题解 T1 排序问题 题意 九条可怜是一个热爱思考的女孩子. 九条可怜最近正在研究各种排序的性质,她发现了一种很有趣的排序方法: Gobo sort ! Gobo sort 的算法 ...
- BJOI2018简要题解
BJOI2018简要题解 D1T1 二进制 题意 pupil 发现对于一个十进制数,无论怎么将其的数字重新排列,均不影响其是不是 \(3\) 的倍数.他想研究对于二进制,是否也有类似的性质. 于是他生 ...
随机推荐
- Crypto CTF 2019 writeup
Crypto CTF 2019 writeup roXen 题目 roXen Relationship with a cryptographer! The Girlfriend: All you ev ...
- .NET6: 三分钟搭建WPF三维应用
要运行本文中的示例,请先安装Vistual Studio 2022,社区版就可以了. 1 创建项目 选择创建WPF应用 给程序起一个酷酷的名字,选一个酷酷的位置: 选一下.NET6 2 配置项目 从n ...
- SpringCloud集成Security安全(Config配置中心)
1.说明 为了保护配置中心的敏感数据, 需要对Config Server进行安全保护, 本文基于Spring Security方案, 为Config Server增加最简单的Basic安全认证. 2. ...
- C# 服务器发送邮件失败
邮件发送相关端口 首先说下邮件发送的端口:25/465/587 25端口 25端口是为SMTP协议服务开放的,是这三个端口中最老的一个.25端口也称为消息中继端口,因为这个端口经常被恶意利用,所以现在 ...
- 【操作系统】I/O多路复用 select poll epoll
@ 目录 I/O模式 I/O多路复用 select poll epoll 事件触发模式 I/O模式 阻塞I/O 非阻塞I/O I/O多路复用 信号驱动I/O 异步I/O I/O多路复用 I/O 多路复 ...
- 高可用k8s集群搭建
虚拟机选择 Win10 Hyper-V 总体架构 三个master,三个node master的组件 etcd kube-apiserver kube-controller-manager kube- ...
- MYSQL架构理解
目录 一.MYSQL架构 1. 架构图 2.分层实现 3.查询组件 二.并发控制 三. 事务 四.引擎 摘自 通过对MYSQL重要的几个属性的理解,建立一个基本的MYSQL的知识框架 一.MYSQL架 ...
- linux 之 命令提示符设置
linux 命令提示符设置实际就是设置环境变量PS1的值. 参数说明 \d 显示时间,星期 月 日 \h 显示简写主机名,如默认主机名 localhost \t 显示24小时制时间, HH:MM:SS ...
- Python中切片方法总结
对字符串或列表使用切片方法进行操作时 对包含[-1]的方法的使用经常用错 其实[-1]即指最后一个元素(同理[-2]指倒数第二个元素) 现总结如下 以便加深记忆 >>> li = [ ...
- JDBC 处理sql查询多个不确定参数
JDBC程序,为了防止SQL注入,通常需要进行参数化查询,但是如果存在多个不确定参数,就比较麻烦了,查阅了一些资料,最后解决了这个问题,现在这里记录一下: public List<TabDl ...