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\) 的倍数.他想研究对于二进制,是否也有类似的性质. 于是他生 ...
随机推荐
- JSON(JS 对象简谱,一种数据交换格式)
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式 存储和表示数据的文本格式 层次结构清晰.简洁 JSON是一个序列化的对象或数组 1.js ...
- Cython编译动态库、引用C/C++文件
将某些.py 编译成动态库 设置好要编译的module们: compile_to_c_modules = [ 'package.module' ] 将它们转换成cythonize可识别的参数: def ...
- nginx -g "daemon off;" 你学废了吗?
去年的时候写了一篇原创<前后端分离,如何在前端项目中动态插入后端API基地址?(in docker)>, 我自认为这篇生产实践是对大前端. 容器化.CI/CD的得意之作. 对于前后端分离的 ...
- CS5265替代CH7211|Capstone CS5265芯片|替代CH7211芯片
龙迅Chrontel的CH7211是一款Type-C转HDMI2.0半导体设备,可通过USB Type-C连接器将DisplayPort信号转换为HDMI/DVI.这款创新的基于USB Type-C的 ...
- Java实习生常规技术面试题每日十题Java基础(六)
目录 1.在Java语言,怎么理解goto. 2.请描述一下Java 5有哪些新特性? 3.Java 6新特性有哪些. 4.Java 7 新特性有哪些. 5.Java 8 新特性有哪些. 6.描述Ja ...
- 编写Java程序,模拟五子棋博弈过程中的异常声明和异常抛出
返回本章节 返回作业目录 需求说明: 模拟五子棋博弈过程中的异常声明和异常抛出,判断用户所下棋子的位置,是否超越了棋盘的边界. 棋盘的横坐标的范围为0-9,纵坐标范围为0-14,如果用户所放棋子的坐标 ...
- .net core在linux下图片中文乱码
不得不吐槽一下,.net core 2.2的System.Drawing在linux有很多坑,又是依赖libgdiplus,又是依赖gdiplus,依赖解决了又来了个中文乱码,怎的一声哀叹 这里做个笔 ...
- Appium之xpath定位详解
前面也说过appium也是以webdriver为基的,对于元素的定位也基本一致,只是增加一些更适合移动平台的独特方式,下面将着重介绍xpath方法,这应该是UI层元素定位最强大的方法啦! 以淘宝app ...
- git 忽略本地文件的修改
项目开发过程中,会遇到本地配置文件每个开发人员不同的情况,但如果遇到类似数据库配置这种最终需要加入 git 版本控制的配置,则会陷入两难境地.要么不跟踪,要么有人提交后其他人同步下来必须手动修改,非常 ...
- vant引入及配置
1. vant 官网 https://youzan.github.io/vant/#/zh-CN/quickstart 2. 通 npm 安装 npm i vant -S 3.安装 babel-plu ...