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\) 的倍数.他想研究对于二进制,是否也有类似的性质. 于是他生 ...
随机推荐
- KISS原则
Keep It Simple, Stupid 1. 模块性原则:写简单的,通过干净的接口可被连接的部件:2. 清楚原则:清楚要比小聪明好.3. 合并原则:设计能被其它程序连接的程序.4. 分离原则:从 ...
- CS5211替代CH7511B|DP转LVDS控制板|替代CH7511B设计电路方案
CS5211性能和参数可以替代CH7511B,PS8622,PS8625,LT7211等方案,用于设计DP转LVDS转换器,DP转LVDS控制板,DP转LVDS转接板等产品设计. CS5211是一个e ...
- Vue.js高效前端开发 • 【Vue组件】
全部章节 >>>> 文章目录 一.Vue组件介绍 1.组件概述 2.组件使用步骤 3.实践练习 一.Vue组件使用 1.组件注册 2.组件注册语法糖 3.使用script或te ...
- 对比显示每条线路的价格和该类型线路的平均价格,分别使用子查询和 exists 获取线路数量
查看本章节 查看作业目录 需求说明: 对比显示每条线路的价格和该类型线路的平均价格 分别使用子查询和 exists 获取线路数量超过"出境游"线路数的线路类型信息,要求按照线路数升 ...
- 使用 Android Studio 开发工具创建一个 Android 应用程序,并在 Genymotion 模拟器上运行
需求说明: 使用 Android Studio 开发工具创建一个 Android 应用程序,并在 Genymotion 模拟器上运行 实现步骤: 打开 Android Studio,创建一个 Andr ...
- CSS基础6之盒子模型1
盒子概述 以下是盒子模型的一个图形解释 一.内边距(填充) 属性有: (1) padding 设置所有内边距 (2) padding-top 设置上边距 (3) padding-left 设置左边 ...
- MySQL约束和数据类型
约束条件 约束条件就是在给字段加一些约束,使该字段存储的值更加符合我们的预期. 常用约束条件如下: UNSIGNED :无符号,值从0开始,无负数 ZEROFILL:零填充,当数据的显示长度不够的时候 ...
- 不用find,怎样递归地给目录设置700,给文件设置600权限?
https://stackoverflow.com/questions/36553701/how-to-set-permissions-recursively-700-for-folders-and- ...
- 教你三步在CentOS 7 中安装或升级最新的内核
转载自:https://www.linuxprobe.com/update-kernel-centos7.html #步骤 1:检查已安装的内核版本 >uname -sr #步骤 2:在 Cen ...
- vs2017 winform 组件 -- 总结
1.ComboBox [下拉框] (1) 添加选项 this.[控件名].Items.Add("内容") (2)设置下拉框 自动完成 模式 和 数据源 this.[控件名].Au ...