AtCoder随做
突然发现只有我没写过 AT。
没写题解不意味着没做,有的忘了写或者太草率了就算了。
部分前言删了。
不妨 Ctrl
+ F
看看有多少个 考虑
则
复杂
证
容易
由于
最
于是
而
我们
化
等等词汇。
- ABC020D
- ABC241G
- ABC268
- AGC003D
- AGC004D
- AGC004E
- AGC004F
- AGC005C
- AGC005D
- AGC005E
- AGC005F
- AGC006B
- AGC006C
- AGC006D
- AGC006E
- AGC006F
- AGC007B
- AGC007D
- AGC007E
- AGC007F
- AGC008B
- AGC008C
- AGC008D
- AGC008E
- AGC008F
- AGC009B
- AGC009C
- AGC009F
- AGC010B
- AGC010C
- AGC010F
- AGC011C
- AGC011D
- AGC011E
- AGC011F
- AGC012D
- AGC013B
- AGC013C
- AGC013D
- AGC013E
- AGC014E
- AGC015C
- AGC015D
- AGC015E
- AGC016C
- AGC016D
- AGC016E
- AGC016F
- AGC017C
- AGC017D
- AGC017E
- AGC018C
- AGC018D
- AGC018E
- AGC019C
- AGC019D
- AGC019E
- AGC019F
- AGC020D
- AGC021B
- AGC021C
- AGC022B
- AGC022E
- AGC023B
- AGC023C
- AGC024E
- AGC026C
- AGC026D
- AGC027B
- AGC027C
- AGC027E
- AGC028D
- AGC029B
- AGC029D
- AGC029E
- AGC030E
- AGC030F
- AGC031A
- AGC031B
- AGC031C
- AGC032A
- AGC032B
- AGC032C
- AGC032D
- AGC033D
- AGC033E
- AGC033F
- AGC034D
- AGC034E
- AGC035B
- AGC035C
- AGC035D
- AGC035E
- AGC035F
- AGC036B
- AGC036C
- AGC036E
- AGC037B
- AGC037C
- AGC037D
- AGC037E
- AGC037F
- AGC038E
- AGC039B
- AGC039C
- AGC039E
- AGC040B
- AGC041F
- JOISC2018I
- Xmas21C
- TBA
- TBA
- TBA
- TBA
ABC020D
题解
其中
直接暴力计算即可。
ABC241G
题解
有趣而套路的网络流建模题。
考虑假设某元素是否可行,转化为判定问题:每个未被匹配的边要选择一个赢者,且每个元素被选择次数有限。
这个问题感觉就不能贪心!感觉和图匹配很像!
因此构造网络流图,对一条未被取用的边 ,向一个点 连边, 向汇点连边;源点向每个点连次数上界容量的边,或者说这么多条容量为 的边。
如果能将每个未被匹配的边都流满,则说明可行,否则不可行。
这个网络流图的点数、边数均 ,引用经典结论,Dinic 复杂度为 。
由于要跑 轮,总复杂度 ,可以轻松通过。
ABC268
题解链接。
AGC003D
题解
这种数论题目都很套路,感觉没啥意思。
简单来说,注意到 ,肯定是和 相关的复杂度了,其中 。
首先把每个数的立方因子给除掉,则若 满足 (下称满足匹配),则其对答案的贡献为其中较大的出现次数;对 特殊处理即可。
显然只用质因数分解即可得到答案,考虑如何质因数分解。
除掉立方因子需要 的复杂度,同时也能分解出其所有 的因子,以及剩余部分。
考虑剩余部分 不会有超过 个质因子,且均 ,考虑分类讨论:
- 。这个比较简单。
- ,只用考虑 的质数,显然 的部分一定无法匹配。
- ,则可以开根找到 。
- ,由于 , 必定无法匹配。
然后容易直接计算答案。
总复杂度 ,其中 的贡献来自于 map
(可以哈希表代替), 来自于线性筛素数(实践时可以写 bitset
埃筛)。
AGC004D
题解
基环树.jpg。
已经保证是 在环上的基环树。
由于 走 步后到 ,故环长为 的因子。
假设环上有一点 ,满足走 步后到达 号点,则说明环长是 的因子。
因此环长 。
于是转化上树结构,以 为根,其余节点均在 步内应到达 。
考虑贪心。
某个子树若父亲不是 且已经有最大深度为 ,直接把根节点连向 ,即可。
最优性显然。
总复杂度 。
AGC004E
题解
铜牌题。
考虑让出口动而不是机器人动,方便思考。
考虑怎样的水平移动行区间是合法的。
假设起点在第 列(列编号 ),则从起点往左 步、往右 步的区间合法,等价于
- 。
- 。
接下来把行、列同时考虑。
由于移动的路径是连续的,我们不能简单地界定答案在一个矩形中。
考虑 dp。
假设目前剩余部分左右从 到 ,上下从 到 ,矩形外部分最大能取的量为 。
假设起点在 ,则
直接 dp,复杂度是 的,感觉不能通过(能通过就有鬼了)。
考虑一个剪枝:如果 中的某个时刻,已经满足了 ,则其不用去更新别的答案;直接把其内部贡献算出来即可。
考虑另一个更强的剪枝:事实上,只要 或 ,就容易构造方案取遍矩形内所有元素!
然后,如果 ,则 总为 !
然后这样的 dp 常数会很小!感觉可以通过!
但是不会正解,考虑贺一贺题解。
我去,原来暴力 dp 就是正解啊,那没事了(
不懂啊,那为啥要开 迷惑人。
AGC004F
题解
银牌题。
显然只可能为树或基环树。
考虑树的情形。
由于树是二分图,对节点进行分类,若不等量则无解。
否则考虑如何完美匹配。
一对左、右部点的匹配,其需付出其距离的代价;可以猜测存在某个最优完美匹配方案总可增广(基于贪心的方案总可增广,容易验证最优性)。
考虑对每条边计算答案,显然计算时要付出其一侧左右部点数目差的代价。
这样就解决了树的情形。
考虑基环树。
如果是偶环,则左右部点分类的结论不变,考虑计算环上贡献。
这个是经典的「HAOI2008」糖果传递。可以证明总可增广。
如果是奇环,考虑怎么简化处理。
我不为左哦,贺题解!
如果环是奇环,那么环边操作一次就会让黑色点增加 或者让黑色点减少 。不难发现,这种情况下如果黑色点白色点的差是偶数就一定可以通过操作这个白边来让整个图有一个解,并且这种边的唯一用处就是用来增加点。
于是我们可以直接给这条基环边的两侧加上全图黑色点与白色点的差除以 ,然后跑树的做法即可。
懂了,就是删掉一条环边,加虚点赋一个权,然后和树一样做哦……
根本想不到!!!
总复杂度 或 。( 要基排)
AGC005C
题解
经典结论:其最远距离必定到达直径端点之一。
找到出现了至少 次的最大值,作为直径端点。
假设直径长度为 。
提取出直径的链,考虑在此基础上加点(显然这个链得存在,容易分析各点数值)。
每个点的距离得 ,其中额外加的点必须在 间。
然后就完了。总复杂度 。
开 搞谁心态呢。
AGC005D
题解链接。
AGC005E
题解
这就是铜牌题吗。
完全没思路啊!贺题解贺题解!
我去,原来可以原地不动啊,漏看了一个条件;我还以为和象棋车杀将一样,不能原地不动的。
称双方为甲乙,称树为甲树乙树。
那么这个结论就很显然了:如果某时刻甲在 ,乙不在 及 旁,且 在乙树距离不小于 ,则无法结束。
在满足此点前,我们考虑到每次甲若移动,必定是走距离不超过 的边。
我们把乙树以乙为根;则,可以证明,在达成 -1
前,每轮移动后甲都在乙的子树中。
于是每轮只有这么 种方法:
- 甲不动,乙往甲走。
- 甲动,乙往甲走。
如果甲不动,乙为了抓甲,肯定不会摆烂不动;否则甲可以循环此过程。
如果甲动了,乙仔细分析发现如果自己旁边就算有甲能走到的在乙树上距离不小于 的节点,也不会按兵不动;否则对方就在底下那个位置摆烂了,乙就抓不到甲了。
简而言之,乙只会 keep walking。
而甲则只会在乙刚好处于甲想去的位置附近时 keep sleeping,否则还会 walking。
简而言之,甲只会不停走,一直走到一个合理的点后开摆;乙会不停走,一直走到杀到甲家门口,或者让甲逃之夭夭。
并且显然的是,在摆烂前,甲不会反复横跳;否则总可以直接开摆。
那么我们就可以 bfs / dfs 找出所有甲树上的节点到甲的距离,已经乙树上的节点到乙的距离;如果中间某节点不可作为增广对象,直接不更新,把走向该节点的方案用来更新答案即可。
同时,对每个曾经成功遍历到的节点计算如果直接开摆的收益即可。
总复杂度可以做到 。
AGC005F
其实写过题解。
AGC006B
题解
有趣而简单的题目。
容易发现 总是无法构造,那么 呢?
如 ,你在最下面一层放一个 的结构,那么 和 上面均会有 ,从而只要不到空格则一直有 ,把这个东西摆中间即可。
于是特判 与 即可通过。
总复杂度 。
AGC006C
题解
草真就 C 开始就申必题是吧。
考虑到每次操作即 。
于是就是经典套路。
考察差分数组,单次操作就是交换相邻两个数。
把置换取出,进行置换循环分解取幂,于是就得到结果。
高质量 精度是吧。/cf
AGC006D
题解
人话题意:写一个 B 的 spj。
我不好说,但是感觉十分困难啊!
考虑沿用「TJOI / HEOI2016」排序的做法进行二分答案。
现在给定的排列变成了 串,考虑怎么做。
注意到中间三个数若出现相邻两个相同,则可以沿用 B 的思路得解。
否则,总是 形式,我们再往外考虑一位。
若某处出现相邻两项相同,则合并时会“偏移一位”保持相同,如
0 001 00101 0010101
所以最终值即为离中点最近的“相邻两项相同”!
同时,对于 等情况,容易特判。
总复杂度 。
感觉可以优化到线性。
AGC006E
题解
首先,各列只会不变或翻转,同时左右平移。
所以如果某列不合法则可直接判掉。
然后只用记录信息:当前列来自第几列,上下是正是反。
每次操作将交换相距 的两列,同时将三个部分上下翻转。
考虑怎么判断这些信息合法。
首先如果出现奇偶性不同的列,直接不可行。
然后我们发现,依次操作 可以实现对四项翻转却不移动。
同时我们发现,依次操作 ,可以实现对 项翻转却不移动。
再做一次四项的翻转,即可实现对 项翻转却不移动。
因此,我们可以认为第 列的翻转与第 列同理,第 列的翻转与第 列同理,等等。
考虑暴力把交换操作完成,则剩下的部分只有翻转操作,容易检验。(像是 的感觉?)
交换的过程可以用各种方法优化,总复杂度容易做到 。
感觉可以做到线性!
Update:瞄了眼题解,原来 ,确实可以 算。
AGC006F
题解
图论转化免不了的。
考察一个点数 满足 的环( 即单个自环, 则为一组双向边),其会变成一个有向完全图(含自环);否则不能。证明较为简单。
设为 个点的环,。
我们不难发现, 的边都可连。
因此我们可以继续进行该操作,变成 的边都可连,变成 的边都可连,等等。
从而, 的边都可连。
进一步容易归纳, 的边都可连,其中 。
于是若 ,则容易发现不能变成有向完全图。
否则,容易发现有向完全图上各边总可被构造。
(哪怕这不是简单环,也一定程度上适用该分析,如 )
对于一个有向完全图(含自环),你在往其 / 从其连一条边,其仍然会变成有向完全图(含自环)。
这样就容易分析我们的理论了:
我们称每个点的点权为 (在 下操作,即对 取模)。
对于每个联通块,我们考虑,称一条边终点的权值为起点的权值 ,起点的权值为终点的权值 ;如果出现矛盾,则说明其为有向完全图。
否则,任意两个权差为 的点都有连边。(要特判只有 种权值的情况)
对有向边建反边,对每个联通块做一遍 dfs
即可。
总复杂度 。
AGC007B
题解
怎么 B 就这么毒瘤。
考虑差分。
则 ,。
我们尝试令
或者,设 ,则
从而
然后 容易构造:;或者一些权值更小的构造。即可。
则 ,即可。
权值在 内。
总复杂度 。
AGC007D
题解
原本以为会很难,仔细想了想也没这么难。
首先走过某处时会顺带把糖果投了,显然不劣。
然后由于总的路径是从左往右的,这部分贡献算好后只用考虑回头路。
容易发现,回头路长度不小于 (假设一直在走路)且互不重叠,我们的任务就是用总长尽可能短的回头路覆盖所有点。
我们把数轴拉宽一倍,这样就是用总长尽可能小的线段,满足每段均不小于 ,覆盖所有目标点。
考虑令每段线段的起点都是一个目标点,我们可以凭此进行 dp。
我们考虑设 为已经考虑了 的所有点,且从 引出了一条线段的最小代价。
则
这个东西容易单调队列维护。
总复杂度 。
AGC007E
题解
申必银牌题。
经过每个节点恰好两次,也就意味着只有进 / 出子树的过程。
由于是二叉树,只能有先左后右 / 先右后左两种走法。
考虑怎么办。
假设二分答案是否 ,考虑怎么做。
直接做不方便,不妨考虑 的状态设法。
对一组 ,我们只用维护其最优解的单调栈: 升则 减。
直接做也太惊悚了,我们考虑怎么高质量地解决。
考虑到,要对于 中的每个 ,找到一个尽可能小的 ,使得其中间合并合法。
考虑怎么办。
容易发现,最终 对的个数不会多于 。
因此少者逐层翻倍,多者最多作为多一次。
于是就得到一个类似启发式合并的结果,复杂度得到保证。
AGC007F
题解
银牌题,感觉很有趣。
考虑一个贪心。
我们每个节点记录被使用时间的时间戳 ,从后往前考虑。
如果当前末尾字符相同,直接跳过。
如果不同,找到上一个相同处,如果找不到直接无解;否则,我们考虑找到上一次出现的位置 ,将这之间的时间戳都更新为区间最大时间加 ,并把区间内元素都赋为相同值。
复杂度容易做到 。
然后这个做法是假的!
因为修改不一定要一次性全部赋好,可以分批进行。
譬如
abacddd aabbccc
可以在两步内完成。
abacddd abbcccc aabbccc
而按刚刚的贪心则是 步。
abacddd abacccc abbbccc aabbccc
究其原因,是我们可以把当前修改的时间戳与前一项达成平衡。
因此,假设某区间的时间戳非 ,并且要从外索求时,可以分段考虑,避免对初始被复制的元素造成干扰。
但是这个观察还是太浅显了。
我们发现,整体的赋值过程还是初始的,问题只在于如何最小化时间。
考虑到,我们每次的赋值实质为一个左右端点分别递增的区间。
由于相邻不相交的区间不相干扰,我们分开考虑。
如上例,每次操作可以画成这样:
oooo ooo oo
同时,我们可以把一个线段拆成若干段,使得
x ooo -> oox oo
x x ooo -> oox ox oo
从而减小总高度。
我们考虑依次添加各条线段,显然右端点部分只用维护到目前右端点为止的信息。
我们发现,加入一条线段的过程,实质上就是给所有元素增高 ,同时从左边一个值域相同段向右边一个值域相同段添加一项元素!
我们维护每个位置的高度,再加上懒标记,直接维护处理即可。
总复杂度 。
所以这题我自己都能想出来,为啥能有银牌啊。
AGC008B
题解
怎样的情况是合法的?
只有最长的同色连续段长度 的是合法的。
也即必须得有一段相同的结果。
我们枚举这个相同的结果,其余部分直接计算最优的答案。
总复杂度 。
AGC008C
题解
容易发现 没啥用。
然后容易发现答案即为
然后就没了。
这不比 B 简单多了?
虽然 WA 了一发。
AGC008D
题解
感觉很憨啊!
考虑先把已知的位置填了,自然把剩下的都给出了分界。
我们先填“应处于左侧”的元素,并且优先填靠前的;填满后往后填。
另一个方向同理。
最后 check 可行性即可。
这题为啥能有黄啊,不是很认同。
AGC008E
题解
考虑每个置换环,则即 的下项 / 下下项为 。
进而考虑一个环可能会变成怎样的基环树。
如果全部是下一项,则不发生改变。
如果全部是下下项,则奇环会变成一个错位的环,偶环会变成两个等大的环。
如果既有下项,又有下下项,那会变成一颗基环内向树,并且每个节点最多再外挂一条链,链间还有关联;至少一个节点有外挂链。
因此我们得到的 就是这么一个情况。
我们先把每种长度的环提取出来,按前面几种方法计算答案:假设长度为 的环有 个,考虑其贡献。
时,取出若干对匹配成偶环,方案数为
时,取出若干对匹配成偶环,剩下的枚举是否错位,方案数为
然后考虑基环树,其回推的方案。
假设环上有 个节点,环外依次挂着 个节点的链;。
如果 且 间有元素 ,则说明无解。
否则,如果 且 ,则第 项元素带来 的系数贡献。
否则,如果 ,则第 项元素带来 的系数贡献。
(其实就是枚举环外元素的距离是 还是 )
这样就计算了基环树的贡献。
总复杂度 。
AGC008F
题解
对于除了全集外的所有联通块,最小合法 对应的 是唯一的(不要求是关键点);否则容易导出矛盾。
考虑每个 对应哪些最小 合法。
首先
显然。
如果有更优的 满足 与此相同,
那么显然
因此,如果想让 不存在方法使得当前 不优,则应当
也即
直接 dp 计算出对每个点 ,其 。
然后仍然可能会计重。
但是我们刚刚的做法在全部点都是关键点时是对的(此时 ),考虑容斥掉某个点 变成普通点后的负贡献。
则必然没有某个含关键点 的儿子子树被其在 内完全包含;否则自己的最优解总可被别的点表出。
然后求和即可。
不要忘了全选的情况。
AGC009B
题解
淘汰赛可以用一个 Leafy Tree 去描述。
考虑怎么建树。
我们先按给被击败的方案,建出一颗树。
显然,其对应的 Leafy Tree 不一定唯一;如果一个节点儿子多于一个,其先后顺序未定。
------------------ | | -------- s3 | | ---- s2 | | p s1
我们的任务就是最小化树高。
考虑假设我们已经算出各儿子子树内的答案,我们怎么做当前子树。
直接把树高从小到大排序,依次作为上图中的 ,显然最不劣。
总复杂度 。
AGC009C
题解
不妨 。
如果 ,显然无解; 无法分组。
因此,我们现在总有
我们考虑 dp。
设 表示 是否可以均在 集合中;即 。
设 表示已经考虑了前 项,第 项在集合 中的方案数。
于是显然
然后这个容易双指针做到 。
AGC009F
题解
自己做法假了。
贺题解!终于找到一篇能看的下去的题解了:https://www.luogu.com.cn/blog/OUYE2020/solution-at2294。
题解原话:
如果你像傻*我一样到了这里就不继续推导而想着优化暴力 DP 的话,那么你最终会在发现自己的四次方五次方 DP 怎么都会把方案算重的时候崩溃掉。
其实我们可以很轻易地发现,当产生进位的时候,低位处减少 ,高位处会增加 ,此时 刚好减少 的整数倍,也就是说 仍满足 。归纳验证发现, 和 这两条限制已经足够。
这个才是最重要的结论!
因此,我们可以略施巧计,把此部分我们的做法变为
这样就没有那一坨上取整了。
但是,这也意味着,我们必须同时兼顾 的贡献;因为 此时不一定够用。
类似于上述推导,我们同样得到
也即
不过这里假定 了;对于 ,应当特殊处理。
因此不妨 依次 dp,直接做即可。
总复杂度 级别()。
AGC010B
题解
草,读错题了。
那么考虑到,设环上 开始选了 个,,则
因此
直接判断是否总是非负整数即可。
总复杂度 。
AGC010C
题解
由于路径端点不能相同,我们考虑把树转有根,则每个子树向外连的边数量容易发现是定值。
同时应时刻保证合法性;即
容易验证这是充要的。
特殊处理一下根节点,直接树形 dp 即可。
总复杂度 。
AGC010F
题解
神秘 F 比 E 简单。
容易发现如果可能,总是往更小数走。
无路可走时必废。
然后直接用必胜必败态定理即可。
总复杂度 ,瓶颈在排序。
AGC011C
题解
考虑找到一个奇环 ,则考虑一条边 ,我们有
因此一个第二维含奇环的联通块,对于第一维的各个联通块,都是分别联通的。只要第一维不是单点。
第一维含奇环同理。
考虑两维都不含奇环的非单点的联通块,那就是二分图,点集总可分成左、右部。
容易发现这样的情况恰有 个联通块:两维均在左部,或均在右部;两维一个在左部,一个在右部。这两类分别构成一个联通块。
容易发现这样的情况恰有 个联通块:两维均在左 / 右部;两维的左右部类型不相同。
因此,设单点有 个,含奇环的联通块有 个,非单点的二分图联通块有 个,总点数有 个,则总答案为
直接做即可。
总复杂度 。
AGC011D
题解
嗯,感觉这种题,不手玩没得做啊!
用 R
表示向右的球,L
表示向左的球。模拟一下样例一、二。
RABAAA
LBBAAA
RBBAAA
ARBAAA
AARAAA
AALBAA
ABRBAA
ABARAA
ABALBA
ABBRBA
ABBARA
ABBALB
ABBBRB
ABBBAR
规律逐渐浮现了:
如果开头为 A
,则直接弹回并把开头改为 B
。
如果开头为 B
,会将所有下一项为 A
的元素变为 B
,将下一项为 B
的元素变为 A
,最后一项变为 A
。
因此开头为 B
时就是全局轮转并翻转!
当 很小时,我们可以暴力 模拟。
我们把这个算法先用伪代码描述一下(A
为 ,B
为 ,从 标号):
于是,到了 从 变为 的那一步之后,整个序列(按初始时标号)的形态是确定的: 时为 BABABA...BA
, 时为 BABABA...AB
。
之后的过程,容易发现 的形态有循环节;在 时为 ,在 时为 。
其实答案有一个更短的循环节。
直接取模,然后继续模拟即可。
总复杂度 。
AGC011E
题解
申必题。
答案不会超过 易证。我们称 。
假设我们不考虑进位,则得到的数仍然不减。
考虑进位,我们反过来求如果不进位会得到的结果。
则应将高位的部分数向低位回加,直至高位不大于低位。
如果高位又偏小了,则从上上位取;如果上上位又偏小了,则从上上上位取……
这样一直到数列不减,将最后一个数算出其除 上取整的值,即是答案。
容易发现这么贪心是最优的。
我们猜测复杂度可以均摊。但是实际上并不能。
在随机生成的数据下这个东西容易被卡到 级别。
精心构造之下,这个东西可能可以被卡到 级别。(我不确定,应该能卡)
因此考虑如何优化这个贪心的过程。
for(int i=n-2;~i;) if(A[i]<A[i+1]) { int v=(A[i+1]-A[i]+10)/11; A[i+1]-=v,A[i]+=v*10,i++; } else i--;
这段代码中, 将减小 ,于是 将增大 ,又由于此前 ,于是 。
再做一步,得到
等等。
因此,在对数轮暴力修改后,修改的变化量将是形如减 的!
我们维护当前的值域相同段,则就是将此段均减 。
此后的更新可以直接暴力处理,容易猜测不会再怎么涉及到前半部分值域相同段。
这样的操作,在将耗费 的代价同时,获得处理的 范围上的 的增量。
总复杂度 ?
把之前那个做法卡满 的方法大概就是始终维护一个很长的值域相同段?
AGC011F
题解
想睡着了.jpg。醒了后就大概会了。
开始以为自己会 做法,后来发现读错题了……但是也简单。
考虑到其实就是一个形如 的曲线横向连续平移无限次,使得其在某些段无交,要求最小化水平距离(不包含中间的水平段)。
我们考虑从下往上扫描,然后容易发现,我们总可以将左半面的 加到右半部分去,从而减少讨论。
这样整个的形态就变成了 。
显然每个 的长度可以不超过 。
在扫描的过程中,我们计算出 总长模 为 时的最短总长,设为 。
当此段允许双向时,我们总是不妨令此 长为 ,也即不用改变。
否则仅可单向,假设前面部分 总和为 ,当前部分 为 ,则有
考虑到非 的总是一段(模意义下的)区间,我们直接维护此段区间是怎样的分段函数即可。
我们先计算出不变的 ,容易发现,即为 ;特别的,如果 ,说明无解。
考虑暴力维护分段函数,初始 。
每次操作为单点查询、区间修改为公差为 的等差数列。最后全局取 。
因为数据规模较小,不用考虑什么线性做法了,直接 ODT 维护即可。
总复杂度 。
AGC012D
题解
考虑单种颜色内部可以怎么换。
我们总是希望把最小元素拿去和外界交换,从而达成目标,因此就是考虑最小元素可以到达哪些位置。
显然是与其和不超过 的位置。
同时我们考虑,能否将两个本不可交换的元素以外力交换?
如果有与此颜色不同,且与两者和均不超过 的元素,则其仍可交换。
假设质量最小数为 ,其对应颜色 ;颜色非 的最小数为 。特别的,只有一种元素时,认为 。
如果一个元素 满足 ,则其可与别的同色元素交换当且仅当 ;两个这样的数可以互相交换。
如果一个元素 满足 ,则其可与别的同色元素交换当且仅当 ;两个这样的数可以互相交换。
对于一个不满足这些条件的元素,其将不可与任何元素交换,可以直接删去不管。
否则剩下的元素,不同颜色之间,可以考虑方便交换为最小元素,然后再实现互相交换。
因此我们有效的信息只有每个颜色的元素数目和最小元素。
然后如果一个颜色的最小元素 ,其亦不可与其余元素互相交换,可以忽略。
剩下的颜色总可以互相交换,方案数使用多项式系数即可解决。
总复杂度 。
AGC013B
题解
什么玩意。
考虑从一个点开始贪心找没走过的点使劲走。
如果无路可走了,再从起点引出一条路径直至再次无路可走。
两条路径的并即为答案。
正确性显然。
AGC013C
题解
怎么都这么喜欢蚂蚁题。
考虑到交换位置相当于是给点交换蚂蚁,我们只用考虑每个位置是哪个蚂蚁即可。
我们发现,交换不会改变蚂蚁的先后次序,只有经过环边界会把最后一只蚂蚁送到开头 / 开头一只蚂蚁送到最后。
我们只用计算有多少次送到开头 / 最后的操作,即可确定最终次序。
最后归并求出位置即可。
总复杂度 。
AGC013D
题解链接。
AGC013E
题解
憨憨题。为啥有铜牌。
忽略掉现实背景,考虑直接以间隔点为状态 dp。
这个是经典题:遇到幂次就展开!
假设 ,则也即
作为没脑子选手,当然对每个 区间进行矩阵快速幂啦!
特别地,对 时,即为
随便倍增预处理一下即可。
AGC014E
题解
怎样的情况是合法的?
先考虑时光倒流。
我们每次删除一条红边,并将红边两侧点对应的蓝边联通块用一条边链接,要求每步均更新成功。
每次对在当前树上两个用红边链接的蓝边联通块断红边,连蓝边。
因此在蓝树上看来,就是一个红边连接的两点之间只有一条蓝边还没有恢复,将其所在联通块合并。
我们每次找到这么一条红边并对其合并。
考虑怎么优化这个东西的复杂度。
我们考虑在每个联通块处一旦发现其与其旁边联通块的红边端点集合有交即可认为可合并。
我们把其丢到一颗 Splay 上,发现有交则取出,并提出关于其的“合并请求”。
合并时更新答案可以考虑启发式合并。
由于“应当合并时间”和“实际合并时间”会有差异,应当用一个队列或栈维护“下一步合并操作”。
总复杂度 或 。为啥?
差异主要在于,使用 Finger Search 来实现则为单 ,直接用 set
是 只 的。
AGC015C
题解
感觉是个套路题!
森林的联通块数,是经典的点减边。
只用查询矩阵内有多少点、多少两端均被包含的边即可。
这个容易写二维差分。
总复杂度 。
AGC015D
题解
不懂哦,这不是普及组分类讨论?
引理 :假设 ,则 可描述 的所有数。
引理 :假设 ,则 可描述 的所有数。
特判 的情况。
我们把高位全一致的部分去除,则剩下最高位不一致,则 。
枚举目前最高位是 。
如果是 ,则即 的答案,显然是 。
如果是 ,则我们可以把此位是 的数均降为 ;由于我们总可以选择 ,所以没有影响。
由于引理 ,我们可以把当前信息描述为 的形式。
如果 ,答案即为 。
如果 ,我们可以分类答案是否含 ,继续转化子问题 ,并统计 的贡献。
否则,,我们分类最高位,如果为 则是仅有 带来贡献,否则如果是 ,我们发现答案始终不大于 且不小于 。故其答案即为 !
仔细观察容易发现 时该情况答案总是 。
总复杂度 ,实现得优秀容易做到 。
AGC015E
题解
注意到本题 互不相同,这大大减少了分讨。
我们把 看作平面上的点,则相遇时间即为 。
考虑只染某个点时的染色点集是怎么样的。
其会染到 与 的结点。
同时,对于 的节点 ,其被染当且仅当存在 使得 。
同理。
证明的话,使用几何意义,画个图模拟一下增广过程,就易证了。(每步斜率绝对值不减)
我们把所有节点按 排序,则 。
则把刚刚的观察形式化一下,即对一个点 染色覆盖的范围会是一个区间:
即坐标最小的 不小于当前点的元素,以及坐标最大的 不大于当前点的元素。
这个东西显然能二分单调栈算出每个区间。
然后即为查询有多少种方法来覆盖满整个区间。
直接做不好做,考虑利用这些区间的性质。
假如有 ,则 的左端点不大于 的左端点, 的右端点不大于 的右端点;如果 ,则 的左端点不小于 的左端点, 的右端点不小于 的右端点。
通过对 从小到大排序,对相邻项使用该结论,容易发现,随着左端点的单调,右端点也会单调!
考虑 dp,设 表示已经考虑了前 项元素,选择了第 项,且把到 为止整个区间填满的方案数。
枚举上一项填的元素,则
双指针优化一下,dp 部分复杂度即为 。
最后答案即为 。
总复杂度 。
AGC016C
题解
有趣的构造题。
首先 肯定是 No
。
否则,我们考虑把一个 结构重叠放置多次,然后通过在边界上撒较大值的方式来构造。
即,我们把 的矩形的边角放较大元素,并且使之总和恰为 。
不妨把每个重叠多次的结构 这么构造:
这样每次边角的大小就足以把整个 矩形赋为正值了。
总复杂度 。
AGC016D
题解
感觉这种异或之类的套路已经众所周知了啊!
序列开头添一项全部元素的异或值,称作 (或者 ),则一次操作即为将某元素和开头元素交换。
如果两个可重集不相等,答案肯定是 -1
。
否则,我们把 这个东西画到一张图上(忽略自环),容易发现图变成了若干联通块。
容易发现每个联通块都有欧拉回路。
对于包含 的联通块,可以花费边数 的代价解决其相关的问题。
否则,每个联通块会带来边数 的代价。(不考虑自环)
从而解完。
一种比较容易实现的方法的复杂度为 的。
AGC016E
题解
考虑倒推。
我们钦定在某个时刻之后某些元素必须合法。
往前考虑一个操作,如果均不在已考虑范畴则不管,如果一个在一个不在则把不在的那个加上,如果均在则不计入答案。
这个东西,对每对直接暴力做是 的,不够优秀。
考虑优化。
由于这个东西性质很不优美,以及 的奇葩范围,我们不由得考虑起位并行算法。
设考虑了若干步后, 对中含有 元素的布尔值是 ,当前 已经不合法的布尔值为 ,我们发现每次操作可以使用位并行算法优化!
使用 bitset
即可做到 的复杂度。
刚刚这个方法不够优秀,考虑另一个做法:算出为了保留每个元素,需要哪些元素死。
于是就可以做到 。
AGC016F
题解
容易发现先手胜等价于两个节点的 SG 值不相等。
正难则反,统计多少情况下两个节点的 SG 值相等。
我们考虑按 SG 值递增序状压 dp,并且记录目前已钦定元素。
对于未钦定 SG 值的节点,其向每一个正在钦定的节点的出边中应选择至少一条保留;对于已钦定的节点,其出边任意;对于正在钦定的节点,其出边不可被保留。
每次操作枚举子集即可。
总复杂度 。
由于时限很足,容易通过。
AGC017C
题解
这是不是,就是,「BJOI2019」删数,的弱化版,啊!
直接把板子拉过来改改就是了。
口胡一下做法。
注意到元素在序列的位置对答案没有用,直接从值域考虑。
假设 有 个,考虑贪心覆盖的过程。
考虑从高到低扫描线,遇到不能覆盖的数就给答案贡献 ,遇到某个 就更新目前能覆到的最小数。
则一个点 作为未被覆盖的元素带来贡献,当且仅当
因此我们把单个 描述成 区间加 ,即查询全局 个数。
维护全局 个数即可。
这个东西,开个桶统计一下,容易做到线性。
总复杂度 。
AGC017D
题解
我们忽略掉根节点,那么对每个子树而言,其互相独立。
考虑计算每个子树的 SG 值。
容易发现这个是一个类似于 Anti-Nim 的结构。
这种东西只能人类智慧了!
对于空子树,其 SG 值是 。
对于 个点的树,由于其总能转移到 ,所以总是非 。
对于 个点的树,其 SG 值是 。
对于 个点的树,其 SG 值为 。
对于一个点俩儿子的树,其 SG 值为 。
仨儿子又是 。
我们猜测结论:每个节点的 SG 值为各儿子子树的 SG 值之异或和 。
证明?我不会我不会。
其实就是考虑到在各儿子子树的基础上多了一个删父亲边的操作,所以就是这样。
从图游戏的角度,这个证明应该和普通 Nim 游戏的归纳法类似。
然后就直接 dfs dp 就完了。
总复杂度 。
AGC017E
题解
首先这个三连块可以只考虑左右两列信息。
对每一侧,只用考虑其是否接地,以及和另一块积木的拼合位置;拼合位置数目是 的。
考虑转化为图论背景:左部点表示在积木左侧接地或者右侧悬空,右部点表示积木右侧接地或者左侧悬空。
那么,我们称一块积木,就是图上的一条有向边。(从左侧连向右侧)
我们的目标,就是把图上的边集,分解为若干条从左部到右部的路径。
我们知道合法的必要条件有:
- 对于每个有边的联通块,左部点出度之和大于入度之和;
- 左部点出度不小于入度,右部点入度不小于出度;
- 对于每个有边的联通块,左部点出度减入度之和等于右部点入度减出度之和。
那么,我们利用欧拉路的结论,大胆猜测,同时满足这几条,就是其合法的充要条件!
证明?鸽了!感觉应该和欧拉路那套理论的证明类似。。。
交了一下直接过了。
AGC018C
题解
假设先均取 ,然后取恰 个 贡献,恰 个 贡献。
然后按 排序来, 先取 个,没取的再按 排序,取 个 最优的。
考虑贪心反悔找增广路。对 再增量一个,并从已取元素中取最大 元素计入 贡献,并从 贡献中弹出目前最小元素,如不合法则不增广。注意增量时若已经对 贡献,应额外讨论。
这个过程容易用堆维护。
(其实就是模拟费用流?)
总复杂度 。
AGC018D
题解
考虑反向统计贡献。
一个显然的上界:每个边最多会被计算 次;具体就是左右节点横跳的贡献,容易发现这是一个比较紧的上界。
我们尝试构造方案尽可能取到这个上界。
我们先考虑双重心的情况,容易发现从一侧重心开始,在左右子树任意交替选择,最后到达另一侧重心,即可取满。
再考虑单重心的情况,那么任一子树大小均 。
使用经典结论(「ZJOI2018」历史,或者 「POI2015」LOG),我们可以证明,任取重心外一点做起点,以重心做终点,存在遍历整个图的方案使得步步跨过重心。
这样唯一会被算不满的贡献就是起点和重心之间的边,直接统计这样的边中最小值,从答案中减去即可。
至于单重心时这个算法的最优性,我们考虑只用证明,无论如何取,至少会有一条和重心相连的边不被取满。
容易发现,假设起点在重心为根的树上的某个子树内,那么其到根的路径上的边,总不可能取满贡献。
因此减去权值最小的和重心相连的边的贡献即可。
总复杂度 。
AGC018E
题解
组合意义天地灭,代数推导保平安。
答案显然即
我们的目标就是优化其计算。
我们先考虑代数推导。
我们把对 的和式挪到最外层,那么里面就是两个分别关于 和 的和式。
考虑分开来计算出封闭形式。
对于 的求和,我们有
同样,对于 的求和,我们有
然后我们只用计算 种
这种形式即可。
现在这个东西不方便直接做,考虑如何快速算。
注意到把阶乘展开,这是一个关于 的卷积式,可以使用 MTT 做;不过由于要做 轮,以及数据范围 ,再加上 MTT 的大常数,肯定是过不了的。
因此,我们考虑使用组合意义。
这个和式可以理解为从 的各种走法上经过矩形 的节点数之和。
容斥一步,转化为从 的各种走法上经过矩形 的节点数之和,询问 次。( 倍常数警告)
我们发现,直接枚举从边界何处其第一次离开矩形,即可做到 的复杂度。
总复杂度 ,其中 ,来自于容斥(显然此处带来的常数差异不可忽略,故计入复杂度记号); 表示值域。
AGC019C
题解
一种复杂并且需要大分类讨论,但是没有大思维量的做法。我会说我调了一天吗。
首先容易发现只用考虑在起点终点构成矩形中的喷泉,不妨起点在左下方,终点在右上方。
于是我们考虑,对正常的路径,我们只可能向右、向上走。
我们把这部分贡献算出来,然后每个喷泉处有一个附加的贡献。
考虑如何计算这部分附加的贡献。
考虑每个喷泉必然从一个 左插头 或者 下插头 进入,必然从一个 上插头 或者 右插头 离开。
我们发现,假设已知从左插头、下插头的最小权值,则可以知道从右插头、上插头出去的最小权值。
我们只用知道哪些节点可以更新到当前点。
我们称两个节点 构成 的 偏序,当且仅当 。
一个节点的右插头可以更新到当前节点的下插头,当且仅当其往当前点构成偏序。
一个节点的上插头可以更新到当前节点的下插头,当且仅当其往当前点构成偏序,且 两点之间至少存在一行满足不存在能同时与两节点之间所有节点构成偏序的点。(正确性证明:如果存在空行那么显然,如果不存在则可以从两个不构成偏序的节点间穿过去;除此之外,总是不可行)容易发现这样的节点的 一定小于一个定值,可以用并查集找出。
剩下两类贡献同理。
和起点、终点的连边贡献可以类似地分类讨论。
整个过程于是即可离散化,扫描线,并用 BIT 维护前缀 ,从而进行 dp。
总复杂度为 。
注意,为了避免离散化丢失“空行”的信息,我们要在离散化数组中手动加入空行。
AGC019D
题解
首先,无解当且仅当 且存在 。
总可以发现,任意一种最优路线均形如向左共 步,向右共 步,终点在起点左 / 右 的位置。
用调整法容易证明,答案为 ,其中「未匹配对」定义为 与 在同一下标处,或者 和 在同一下标处。
我们不妨枚举终点,然后最小化 。
那么,一个方案合法当且仅当任何一个 的数都曾经到过 的位置(包括终点)。
从而可以转化成不多于 条限制,每条形如 的形式,其中 表示如果只向左 / 右,其至少多远到达 中的 ;向左还有限制时为 ,向右时为 ;最后再加上 与 两条基本限制。
这样我们就是进行如下规划:
考虑用图解法解规划。
我们把这些限制通通画到二维平面上,就是若干个 平面与两个半平面取交,求其上最小 。
注意到 在 为定值时为一斜线,我们考虑找轮廓线上的最小合法点即可。
这个可以直接桶排然后单调栈处理。总复杂度 。
如果注意到前面的若干限制是始终不变的,此题实际上可以用扫描线做到更优复杂度!
由于要对前面的「未匹配对数目」贡献使用 FFT 加速计算,总复杂度将为 的。
AGC019E
题解
首先期望转方案数。
我们假设 个 , 个 ,。
考虑一条
的链,则其先后顺序是固定的:只能从后往前依次交换。
除掉这些链外,其余 之间乱指不做影响。
因此,答案即
我们发现后面这个东西其实就是斯特林数 ,直接除 然后 ln/exp 计算多项式快速幂是 的。
然后就做完了,总复杂度 。
AGC019F
题解
考虑 dp。
注意到 每步减一,设 ,则有
设 ,则
考虑每个 会被几次贡献,容易发现即为 。
因此 即
这个东西一脸范德蒙卷积状,但是并不一致,这就很糟糕。
分类讨论转化一下容易变成
看上去没有什么简便易用的公式?
注意到数据范围很小(),考虑暴力卷积解决。
如,我们使用此公式,则考虑计算
设 。
则即求 。
这是经典的卷积问题,使用多叉分治可以做到 。实现得精细可以通过。
只是不知道有没有 的倍增做法,感觉不像有的。
但是肯定没人愿意写这种东西的。。。
EI 给了个代数推导,我也不会,摆。
AGC020D
题解
呜呜,分类讨论题,不过分类并不复杂,只用特判两类边界情况。
设 ,这样就立刻得到了合法的连续的相同字符个数的最大值的最小值。证明显然。
考虑一个分类讨论做法。
判掉两个边界情况:
- 若 ,则答案形如 个 之后加 结构。
- 若 ,则答案形如 个 之前加 结构。
否则,容易发现,最优解必然形如:前面若干个 结构,中间一个 结构,最后若干 结构。
证明可以考虑调整法,大致就是把 尽可能后置, 尽可能前置,此处略去。
假设 个 结构, 个 结构,中间的结构 两部分分别有 个,我们令 。
我们希望尽可能增大 ,然后在此基础上尽可能增大 。
容易发现 ,,于是
则
从而
容易发现这样的 只有 个,我们暴力枚举之,设为 。
进一步,由 ,我们得到
从而
由于 ,于是合法的 也只有 个,暴力枚举即可。
我们发现我们只用枚举 种情况,把其中的合法方案取最优解,直接把询问区间进行模拟输出即可。
然后就完了,总复杂度 ,其中 表示输出长度。
AGC021B
题解
考虑取出凸包,显然凸包内的点以及边上的点答案可认为是 。
对凸包上的点,容易发现就是求各点对应泰森多边形占总面积的比重。
我们按点之间距离,从小到大逐条加入,并且始终保持当前点集无交,最后即得到一个三角剖分。
对各边做中垂线即得泰森多边形。
容易发现最外层凸包依旧保留,所以泰森多边形的主要面积大致与最外层凸包的相邻边的中垂线的夹出的面积相等。
直接用数量积计算夹角即可。
总复杂度 ,瓶颈在排序。
AGC021C
题解
首先如果 或 或 ,直接无解。
然后分类讨论。
先考虑行列均为偶数的情况。
如果 ,有解当且仅当 ,做法是把每个四分格中填满两个横骨牌或者两个竖骨牌。
如果 ,我们把每个四分格填满,剩下部分总可以放骨牌。
然后考虑奇数行偶数列的情况。
我们可以令 ,,转化为之前的情况;即对最后一行特殊处理。
偶数行奇数列同理。
最后考虑奇数行奇数列的情况。
如果 或者 ,构造是平凡的。
否则,我们先把最后一行、最后一列放满,总可以在右上角处留下一个空位。
如果 ,构造是平凡的。
如果 ,我们先取满四分格,如果有多余的一对横竖骨牌,总可以往边界插入一小格。
然后就完了。
AGC022B
题解
考虑令 ,且各数均为 或 的倍数。
令 ,假设取 个模 余 的数,显然 。
显然 且 。
把 取得足够大,然后剩下的部分交给 即可。
考虑怎么取。
显然可以把条件拆成 和 。
当 ,设 ,则 且 ,我们不妨取 ,。容易验证 时均合法。
对 的部分,我们取 即可。
取 ,剩下部分交给 即可。
需要特判 。
AGC022E
题解
先考虑如何判定是否合法。
我们考虑先把每个 结构收缩成单个 。
于是接下来除了边界外不会有单个 ,且 段长度不会超过 。
此后若 比 多,则可以为 ;否则只能为 。证明是平凡的。
考虑记录此时每个前缀中 比 多的个数,如果一个前缀中 已经比 多了至少 个,则显然答案只能为 了;而少的个数不可能少于 个。
考虑加入一个字符,我们在状态中记录:
- 当前是否已有某个前缀满足其已必胜;如已必胜则不用记录之后的东西了。
- 当前前缀 比 多的个数()
- 当前结末符状态,包括 五种。
这些结末符之间的转移关系是
其中 的变换会对前缀 比 多的个数造成特殊影响,而其余只会普通地造成影响。
容易发现自动机上实际状态数是不满的,直接 dp 套 dp 来统计方案数即可。
假设自动机上的状态集为 ,复杂度即为 。
在本题背景下,按刚刚的方式直接暴力实现,则有 。
有没有基于压状态的更优实现?
仔细分析容易发现 和 可以压在一起, 和 可以压在一起,直接压缩即可。
这样结末符只有 三种了。
于是即有 。
实际上由于每次操作时前后缀和总是奇数 / 偶数,可以凭此再减小一半常数,不过没有必要。
如果认为 为常数,复杂度即为 。
AGC023B
题解
考虑二维哈希判定矩阵相同。
我们把原矩阵和转置后矩阵均向外延拓至 ,则每个 对对应的矩阵都是其的一个子矩阵。
同时对两个矩阵上二维哈希就好了。
一个矩阵的二维哈希值为 ,显然可以二维前缀和。
我们先对每个字符做一个到 的随机映射,在模 意义下嗯做就好了。
总复杂度 。常数很大。
AGC023C
题解
考虑改求期望分数,答案即其乘上 。
显然有 。
考虑怎么求后者。
一个含 项的方案的存在概率为 。
注意到一种合法即为任一不被选择的元素不在边界,且两两不相邻。
插板即得方案数为 。
于是期望即为
最后乘上 即可。
也即,答案为
直接做总复杂度就是 的了。
AGC024E
题解
我们每次操作相当于在一个位置之前加上一个比当前数严格大的数,或者在结尾加一个数。
容易验证这个是不重不漏的。
考虑构造双射:
一棵树,初始时树上只有一个节点,权值为 。 次操作,每次任意挑一个节点,挂上一个比其权值严格小且权值为自然数的儿子。
容易发现方案数即为答案。
考虑怎么统计方案数。
设 为 个节点,根权值为 的方案数。
设
显然有
注意到这里不是 域,考虑用半在线算法暴力处理。
设 ,显然 ,且
于是
最后答案即为 。
总复杂度 。
AGC026C
题解
考虑前 / 后一半字符,无论怎么染色,每种方案最终一定都确定了一种被匹配的串。
于是直接 meet in the middle 即可。
只用找到有多少给定串合法即可,这个可以使用哈希维护。
由于数据范围很小,哈希可以直接采取 进制编码,使用 __uint128_t
维护即可。
使用 map
的复杂度即为 。
AGC026D
题解
考虑相邻两列的相接处,仅有如下几种可能:
- 完全相反。
- 完全相同。此时列方向上必须交替分布两种颜色。
考虑记录当前列状态:已经考虑了前 列,第 列当前两种颜色交替分布一直到高度 ,且更高部分不合法的方案数。
假设这样的方案数为 ,其中 。
然后转移时直接枚举下一项的状态:是和自己相同,还是相反。
如果 ,则
如果 ,则
初始值 即可。
直接 dp 的复杂度是 的,无法通过。
注意到我们可以把这个 dp 描述成如下形式:区间乘定值,区间赋值为以 为公比的等比数列,区间清空,区间求和。
直接使用动态开点线段树即可维护。
总复杂度 或 。
这个做法还要写线段树,代码太复杂了,常数也会很大。
考虑本题的特殊性质: 很小。
考虑直接对值域分段 dp,我们预先排序,记录下每个区间 对应的 dp 值之和即可。
等比数列赋值的部分可以预处理系数。
总复杂度 。
不过如果改成 的话可能就只能采用前一种方法了。
当然如果离散化改成类似后面这种的形式就是 的了。
AGC027B
题解
有趣的题目。
考虑一次往返,假设采了若干垃圾 ,则必然先走到最后一项 ,然后在回来的路上依次采集。
这样移动带来的贡献为
于是如果 ,我们总是可以每次只采 项。
然而 ,因此我们考虑最小的采了 次垃圾即结束的移动的贡献 ,显然 。
容易发现,最优情况下,最后 项的系数是 ,往前 项系数是 ,再往前 项系数是 ;等等。即
其中 。
容易发现这个贡献关于 非严格地单调减,并且是凸函数。
直接对 二分, 即为答案。
理论上需要 __int128_t
,不过我用 unsigned long long
也过了,感觉和二分的特性有关!
总复杂度 。
以及,就算不二分,本题中各个 也是可以利用差分直接计算做到 的。
AGC027C
题解
猜个结论,合法等价于存在
的结构,其中首尾相连,且允许有重点。
考虑怎么判定。
我们称一个 结构的四个位置为四个相位 ,把每个点拆点,把无向边改写成相位之间的转移,我们只用判定新图上是否存在有向环。
写一个拓扑排序即可判定。
总复杂度 。
AGC027E
题解
首先考虑找不变量。
设 的权值为 , 的权值为 。
容易发现,在模 意义下这个操作是保权值的。
考虑维护原序列权值在模 意义下的前缀和数组 ,容易发现每一步操作相当于删除其中一个数,同时保证两侧权值不同。
只用统计合法子序列数目,且首尾均在原串首尾。
考虑怎么一个区间可以被删干净。
如果该区间长度 ,则其可被删干净当且仅当两侧区间外的数不相等,且区间内存在与两侧区间外均不同的数。两个方向上的证明都是容易的,此处略。
考虑利用这个性质搞事情。
我们假设从 转移到 的可行性为 ;即开区间 可被删空。
考虑 dp,假设我们现在考虑到一个位置 ,设 表示已经考虑了前 项,第一次可行是作为到 终止的子序列的方案数。
注意要求第一次可行,也即不能在之前出现过,以免计重。
则
而最后答案即为
然后嗯做就完了。
注意要特判一种特殊情况,即某种数未曾出现过的情况,此时答案为 。
总复杂度 。
AGC028D
题解
考虑把圆扯成一条链。
考虑在 对上统计一个联通块,其中 和 为联通块中最大、最小元素。
显然一个区间的首尾元素作为最大、最小元素等价于首尾联通且内外不相连。
考虑区间 dp,设 表示区间 与外界没有连边的方案数, 表示区间 与外界没有连边,且 与 联通的方案数。
容易发现
理由是考虑 所连的最右边界。
容易计算,于是每个 均可以被表出,直接区间 dp 即可。
最后答案统计一个 时,还要考虑区间外的选法总数。
总复杂度 ,可以通过。
AGC029B
题解
假设 ,则 。
对于给定的 ,容易发现 中二的幂次存在且唯一,于是 唯一。
考虑从大到小枚举 ,并判断是否还有合法的 供匹配,如有则匹配上;否则跳过当前 。
容易证明这么做是最优的。
总复杂度 。
AGC029D
题解
先手每步只要可以移动必定移动,否则后手可以也不移动让游戏结束。
那么后手的目标就是尽可能让先手碰壁。
后手可以一直“尝试移动”,直到某个时刻开始彻底摆烂。
容易验证对后手这么做最优。
直接模拟即可。
AGC029E
题解
考虑把 的路径提取出来,并且维护出 (不包括 )依次加点时最大标号的单调栈;即,弹栈直至栈为空,或者栈顶元素比当前元素大。
假设栈从底至顶依次为 。显然 。
另令 。
假设 为仅保留编号 的节点与及其间连边的情况下, 所在联通块的大小;如果 即为 。
则,答案显然即
容易发现一个 对应的 是唯一的,可以以 为根 dfs 得到。
然后只用查询 组 ,这个可以离线下来并查集维护。
总复杂度 。
使用线性树上并查集或许可以做到 ?
AGC030E
题解
被这场打爆了啊。。。恐怖思维题场!
注意到一个性质:除了边界外,不可能突然出现 / 消失一种新连续段。
否则,在操作前 / 后必然出现了长度 的连续段,矛盾。
我们考虑记录下每个 和 分界线的位置,容易发现单次操作就是平移一根线。
然后把各种对应方案进行匹配。可以证明各种方案一定均合法。
直接暴力做,总复杂度即为 。也可以做到线性。
AGC030F
题解
破防了一整场,终于找到一道能做的了。这不比 E 简单多了?
考虑把已经匹配的对去掉,剩下的部分分为两种;一种是一个已知,一个未知;一种是两个均未知。
我们先忽略掉两个均未知的先后问题,钦定 小的放在前面,最后乘一个阶乘即可。
考虑从大到小 dp,在状态里记录下目前未匹配的元素中有多少个是钦定的,有多少是未知的。
转移时直接转移即可。容易发现不会计重。
总复杂度 。
AGC031A
题解
开 幕 雷 击。
什么时候 A 题就这么有实力了?
想了一会 dp 忽然发现没必要。
我们考虑到每种字符要么不选,要么选任意一个。
假设字母 有 个,则答案即为
总复杂度 ,其中 为小写字符集。
AGC031B
题解
注意到我们总可以令操作选择的区间不交。
我们对每个位置 记录此颜色其上次出现的时间 ,不存在或者就是上一项设为 。
假设考虑了前 项的答案为 ,则
直接 dp 即可。
AGC031C
题解
这个构造类似于 Gray Code。
我们先令 ,把问题转化成初始为 ,最后为 。最后把每一项均异或上 即为原问题。
如果 ,容易发现必然无解。
否则,我们可以重新排布 的各位,把位拆成奇数个 和若干个 。
只有 个 的时候,我们可以采用传统的 Gray Code 构造方法。
否则,我们把剩下的 逐个配对,并且在最后一轮翻转的时候往右子树递归,当操作的根节点遇到当前位时在子树中每个操作把对应两项互换。
这样就构造完了。
总复杂度 ,代码还是比较好写的。
AGC032A
题解
合法等价于 。必要性显然,充分性由以下给出构造。
当 时直接操作即可。
当 时考虑最后一步,考虑每次删除最后一项满足 的元素,即可转化为 的子问题。容易证明这个元素必然存在,并且容易验证该子问题仍满足该性质。
于是得证并给出了一组合法构造。
暴力做是 的,使用线段树 / 平衡树即可做到 。
AGC032B
题解
构造题!
考虑把点集分成两个集合,在两个集合之间每对点连边。
这样得到的是一张完全二分图。
显然只要 即可构造,也即 。
考虑能不能扩展这种方法。
我们把点分成 个集合,每个集合内点权和为 或 ,这个是容易的: 时即为 , 时即为 。
然后我们把属于不同集合的点两两连边,即可做到每个点的权值均相同。
于是就构造完了。
AGC032C
题解
首先这张图必须存在欧拉回路,也即各点度数均为偶数。
然后可以证明,连通图只要能拆成 个环,就可以拆成 个环。
考虑缩二度点,缩到图上各点度数均 ;一但出现一对重边,立刻用进 个环的要求内,然后删去该组重边。
如果某时刻剩下的环数目不做要求,则必然可行。
如果剩下的图上每个点度数均 且无重边,考虑操作剩下来的点集。
如果还要求 个环,合法等价于点集大小 。这个是容易证明的。
如果要求 个环,合法等价于点集大小 。这个结论的证明细节颇为繁杂,此处略去。
然后就完了。总复杂度 或者 ,根据找重边的方法来决定。
这个做法似乎确实可以拓展到 个甚至更多的环,不过最后的结论推起来可能会更复杂一点。
AGC032D
题解
首先每个数只会被移动不超过一次。
考虑不被移动的元素,容易证明一定存在,其构成一个上升序列。
而最优情况下被移动的元素总可以在移动中经过不被移动的元素。
证明:如果有被移动的元素不经过不被移动的元素,那么最优情况下其一定经过另一个不经过不被移动的元素的被移动的元素,于是该区间内有若干个这样的元素,显然总是容易让这些被移动的元素中至少一个不移动,从而矛盾。
考虑 dp,假设考虑了前 项且第 项不动的最优答案为 ;补充规定 。
在 dp 时枚举上一项,有
最后答案即为 。
这个容易做到 ,然后就做完了。
AGC033D
题解
设 矩阵的凌乱度为 ,容易发现 。
设
容易发现有效的状态数只有 个。
边界的预处理是容易的,考虑转移。
则
前一半的贡献容易计算,考虑后一部分。
注意到 都是一致的,为方便描述,我们接下来使用 直接表示之。
也即
注意到 具有区间包含单调性,于是随着 增长, 递减, 递增。
于是这个函数是关于 先减再增的。
容易发现,当 确定时,对 的 dp 中谷底处 位置随着 的增长不减,使用双指针即可维护。
然而直接暴力 dp 能过,怎么会是呢?
直到某时刻 时终止 dp 即可。
总复杂度 (认为 同阶)。
AGC033E
题解
不妨总是令第一项为 。则,说明弧上不存在相邻的 。
如果串 仅由 构成,则方案数即为不存在相邻 的方案数。这个答案显然就是 。
否则,环上既有 又有 ,不妨假设有 个 ,而 构成的联通块大小依次为 ,使得 ,且该序列若合法,则对答案的贡献为恰 份。
考虑怎样的序列是合法的。
假设 串中有 个 ,其把 序列分成了 各段,其中 。
首先,显然有 ,而 对答案没有影响。
然后,如果有 ,则说明该步必然走到了下一个(相对于上一个) 联通块,且当前 ;如果 ,则该步必然是往回折返的,而没有其余限制。
由于对于每个节点 ,第一步向左 / 向右走都是要做到可行的,所以每种路线带来的限制都是要被计入的;且容易发现没有多余的限制。
所以其实总的限制就是
这样的方案有几种呢?设
则
设 ,则方案数即
从而答案即为
使用 MTT 即可做到 。
MTT 太混乱邪恶了,考虑阳间一点的推导。
由于分母的非 项很少,直接递推即可。
总复杂度 。
AGC033F
题解
怀疑自己是不是看错题目了。
考虑假如一条边 由 和 生成,则往其递归,容易发现递归次数是有限的。
把递归树上的叶子节点取出,容易发现就是图 上的一条路径。
考虑递归的过程相当于是中间的节点 把树 上的路径 裂了开来,因此其实每次的路径都是父亲的子路径。
于是其实最后的叶子节点对应的路径刚好构成原树上路径的一个划分。
于是我们发现递归树的形态是可以任意指定的:可以认为是每次加入最后一条边。
于是整个路径是可以直接从起点开始 dfs 的。
枚举起点,直接在树上 dfs,同时判断当前节点是否可以到达即可。
总复杂度 。
好,果然看错题了。
以某种顺序包含
可还行。原来不是依次包含啊。
开摆。贺题解。
考虑把原图 转换一下,使得图上不存在“有形如 的边对却没有 ”,这样原算法就是成立的了。
把一条条路径插入时一旦发现可以拆开原来某条路径或者被之前的某条路径拆开,就把其拆开,递归下去进行;如果发现已经重边了就跳过。
简单来说,设 为 的路径上第一个和 有连边的节点。
考虑插入一条边 。
- 如果 ,则直接跳过本次插入。
- 如果 存在且不为 ,则改为插入边 ,递归执行。
- 如果 存在且不为 ,则改为插入边 ,递归执行。
- 如果 均不存在,我们先考虑前者,把 子树内的节点 全部更新一下 ;如果某个子树 中已经存在 了,再重新插入一条边 并跳过该子树。后者同理。
然后就可以使用前面的算法解决了。
由于长度总在缩短且每条边最多被再二次插入一次,所以该部分复杂度仍不超过 。
于是总复杂度仍为 。
AGC034D
题解
曼哈顿最大距离是经典问题,注意到
因此最大距离可以贪心分四类贡献考虑。
于是我们可以把配对的过程用费用流描述,中间加 个中转点来对应 种情况。
点数、边数是 的,于是直接流的总复杂度是 的,其中 表示总球数,显然不优并且有概率过不去。
采用原始对偶可以做到 ,或许能过但是很不优雅。
草网络流咋直接 A 了。/qd
果然是玄学。/qd
AGC034E
题解
考虑枚举终点,计算各子树内节点到其距离之和。
如果总和是奇数则直接跳过。
如果最大值 其余值之和则可行。
否则,计算出那个最大一项最小可能是多少(进行子树内移动后),这个可以类似地树形 dp,如果满足上面的柿子则解完。
容易发现这整个过程可以直接 dp。
总复杂度 。
AGC035B
题解
首先由于保证联通,合法等价于 。必要性显然,充分性可以考虑下面的构造。
注意到就是对线图构造完美匹配,我们可以先拉出原图一颗生成树,然后对子树除根外的节点处的度进行最优匹配。
如果子树的根失配了,把其的父亲边从其引出,否则从当前根引出。
对于附加边,一律从前辈向后代引出。
容易发现 时这么做总是合法的。
总复杂度 。
AGC035C
题解
首先 肯定无解。
如果 ,容易构造成
的一个菊花。
如果 ,考虑解决了 的问题后,在何处接上那对 。
注意到
于是在和 相连的 及 处分别接上两个 即可。
总复杂度 。
AGC035D
题解
设 表示已知 号节点对答案贡献 倍, 节点对答案贡献 倍,此时 的最小答案。
则
而答案即 。
考虑暴力递归 + 记忆化。
复杂度不会证,但是直观感觉状态数很少,能嗯冲过去。。。
哦,大概可以考虑每个 会被算到几种,这个只和到根的路径形态有关,然后仔细算可以算出总方案数其实就是 的。
乘上 map
等的复杂度,总复杂度即为 。
AGC035E
题解
如果一个数不存在,我们称其为 ,否则为 。
首先,如果 ,我们可以把奇偶分开做,然后发现合法等价于不出现连续 个 ,直接 dp 即可。
考虑 的情况。
当 时,合法等价于不存在连续 个 ,直接 dp 即可。
否则,,合法等价于转移图上任意一个环均不全为 。
注意到这张图很有性质,我们发现可以仅考虑只向上走两步的环。
那就是 共 个节点形成的环。
其中奇数节点标号 ,偶数节点标号 ,满足 。
也就是,对任意一对为 的奇偶节点对 ,如有 ,则总有 或者 ,其中 表示奇偶项分别下一个为 的节点;如 ,不妨 ,假如 间偶数的部分没有别的 了,那么 或者 。
初始方案中奇偶末尾为 的元素依次为 。
考虑在 dp 时直接记录当前奇偶项最后一个 分别在的位置,以及先前的部分对较小一侧下一项位置的限制,直接上暴力转移即可。
暴力 dp 的总复杂度为 ,使用前缀和可以优化到 ,不过没有必要,因为前者含有若干个除 ,常数很小。
AGC035F
题解
不会猜结论,被创死啦!
结论:最终状态数等于满足不存在 使得 的染色方案数。
证明似乎要调整法,并且说明对应唯一?鸽子。
反正没这个结论做不来,有这个结论就可以考虑容斥了。
简单来说,我们钦定若干对 匹配成上面这种,剩下的部分随意放,最后乘上容斥系数加和即可。
也即,方案数为
然后就完了。
AGC036B
题解
考虑对每个位置找到其“下次出现位置”。
这样我们就可以得到该栈每次清空的时间。
然后就会发现清空操作有一个循环节,并且是纯循环的。
我们把循环的部分去掉,剩下的部分暴力模拟清空栈的操作即可。
总复杂度 。
AGC036C
题解
显然合法等价于:
证明比较简单,此处从略。
考虑枚举 的个数,然后钦定剩下部分不超过 ,计算贡献。
假设 ,则方案数即为
容易线性处理出所有 的答案。
这个东西会多统计含有恰一个 的情况,我们考虑容斥掉该情况,其方案数为 。
然后就做完了,总复杂度 。
AGC036E
题解
?随便猜了个做法就过了。
我们先把原串中相邻相同字符缩一起,统计三种字符出现次数,不妨出现次数上
我们先反复把 缩成 直至 或不存在该结构。
然后反复把 缩成 直至 或不存在该结构。其中 , 可为空,但不可均为 。
最后反复把 缩成 直至 。
然后反复把 缩成 直至 或不存在该结构。其中 , 可为空,但不可均为 或 。
最后反复把一对 , 缩成一对 , 直至 。
容易发现该算法总可执行,且在前 步中最大化已消的 及可能在第四步被消的 的总和,从而能最小化第五步执行次数。
严格的证明我不是很会,但这个做法毛估估就很对,一交就直接过了。
AGC037B
题解
首先,我们猜测贪心地匹配第一对、第二对等等是最优的。
然后,我们猜测在任意最优解中,原来最小的接下来还是最小的,原来最大的接下来还是最大的。
问题在于匹配的方案数,以及中间的选法数。
考虑顺次加入元素,dp 状态里记录下前缀中有多少作为最小值还没用的各种元素,有多少只缺最大值还没来的各种元素。
加入最小值时更新第一类状态,加入中间值时把第一部分向第二部分转移,加入最大值时把第二部分匹配掉一项。
然后复杂度是 的,肯定过不去。
可能可以压状态但是肯定不方便。。。
摆了,贺题解!
哦其实没必要 dp,因为非 状态只有一项。
绷不住了。
复杂度 。
AGC037C
题解
我们不妨倒着操作,且每次操作可以操作的最大元素,直到其比两侧元素中至少一者小或者变成最终值为止。
显然拿个堆就可以维护了。
问题是这玩意要操作几次?
考虑证明每次一个数如果不被移除就会减半:如果两侧较大值 其一半,显然会减半;如果 其一半,那么减一次就减半了。
于是就证明了只用操作 轮即可结束。
总复杂度 。
AGC037D
题解
我们把每个数直接用其最终目标的行号表示,我们的目标就是把每行进行排列,使得每列没有相同元素。
考虑按权值顺序依次决定位置。
假设现在剩下的空间的棋盘已知,各行接下来要放的数目已知,各行哪些位置能放已知,各列要均恰好放一个当前权值的元素。
容易对行、列的限制进行二分图完美匹配建图,点数 ,边数 ,使用网络流的复杂度为 的。
然后对每个权值跑一次即可,复杂度即为 。
然后你发现挂掉了。为什么?
其实上面这种方法并非总存在完美匹配,这就很糟糕。
按行插入而不是按权值插入结果是一样的。考虑改一改我们的算法。
考虑改为依次决定每列放什么元素,从而也可以直接嗯上完美匹配。
然后使用抽屉原理和 Hall 定理即可证明,现在这张图总存在完美匹配。
或者也可以说转化成了子问题,因此仍然可解。
然后就做完了,总复杂度 。
注意由于是稠密图,使用邻接矩阵存图会快很多,写起来也很好写。
AGC037E
题解
我们先枚举第一步的结果,是在哪个最小值。
然后接下来最优操作显然是把目前末尾元素倍增若干次,并且在最后一步同时实现翻转的操作。
直接模拟出最终串,最后取 即可,总复杂度 。
AGC037F
题解
考虑对右端点扫描线,并对当前前缀维护一个单调栈,使得其从栈底到栈顶单调减——因为到当前右端点的所有区间如果遇到比其更大的值,必然会发生改变,所以可以提前变好。
我们规定,一段区间是合法的,当且仅当其可以变成 个相同的数。容易发现这样只会计漏长度等于 的情况,补上即可。
栈中每个点如果是合法的左端点,其取法未必唯一,我们同时记录下该信息即可。弹栈时容易顺带更新。
然后查询一个右端点对应的合法左端点方案数之和时,我们可以依次考虑栈中每个权值相同段中的每个点作为左端点的方案数之和。显然对于一个固定的权值相同段,其方案数只和栈中在其上面的元素可以转化成最多多长的当前值有关。容易发现恰好有一个前缀的方案数被计入答案,使用前缀和即可维护。
由于过程是不断往栈底深入的,我们可以对每次查询对应的答案记忆化,从而使用 进制进位器的技巧进行复杂度均摊。
这样就可以通过了。
AGC038E
题解链接。
AGC039B
题解
首先这肯定是一张二分图,否则必然无解。
考虑到如果 成立,那么 也成立:我们可以把 并入 。
反过来,我们也可以把 中和 没有联系的节点全部移到 中。
于是我们不妨枚举 中最终包括哪个节点,剩下的部分均可贪心执行上述操作解决。
使用 bitset
优化,总复杂度 。
AGC039C
题解
此操作相当于翻转低位并移到高位。
假设经过最少 次操作后相同,显然可以证明 。
我们接下来考虑 的情况,则有
也即
于是
从而 是其的一个周期。
容易发现,如果一个方案对于 合法,当 时也合法。由于 是最小的,所以 ,也即 。
特别地,如果 ,显然无解。
于是均有 。从而 。
从而也即
也即,其是形如每 项翻转一次的序列。
考虑容斥,我们假设最小的合法循环节为 的串有 个合法,容易发现其会被循环节为 的方案统计到,其中 。
假设 对应容斥系数 ,则应有
容易 dp 计算出各项系数。
容易发现 的只有 个,我们计算出其对应方案数即可。
容易发现,我们可以直接计算出高位 项严格小的有几个,再判断高位直接对应的 项翻转层叠形成的结构是否合法,做到单轮 。
总复杂度 。
AGC039E
题解
这道题目好厉害!感觉这个思路很巧妙!
我们先看原问题,我们枚举最后一个节点和区间里哪个节点相连,分别求出方案数。
设 dp 数组 表示 已经和区间 外连好了,接下来要完成 在 内连边的方案数。
考虑枚举最外面一对 的相连。
再考虑枚举 直接或间接所连的最向内的点 , 直接或间接连向的最内的点 。
从而有
由于实际总转移数目非常少,暴力转移的常数巨小,可以轻松通过。
(这种数据范围的设置,大概和「LNOI2022」题很像?)
存在优化到 的方法,不过没有必要。
AGC040B
题解
首先答案一定不小于最长区间长度。我们只用考虑两个集合交集均不为空的答案。
考虑最大 和最小 分别对应的区间。
如果其分离,那么剩下的区间,要么和这两者均不交,要么交一个,要么均交。
如果有与两者均不交的元素,那么不存在两个集合交集均不为空的方案。
否则,我们把交一个的全部交上,均交的可以使得被考虑的部分总有 ;否则长的可以和短的做同一种选法,显然不劣。
然后这些部分一定前一半配左边,后一半配右边,枚举即可。
接下来考虑最大 和最小 不分离的情况。
此时,我们若干对元素的交集贡献仅由最小 和最大 决定。
我们分两类讨论,一类是全局的最小 、最大 在一起的情况,显然此时剩下部分带来的最大贡献为最长长度。
第二类是在异侧的情况,容易发现可以转化为前面分离的情况。
总复杂度 。
AGC041F
题解
考虑贺题解!
AtCoder 阴间题还是不会做。
为了迎合题解,对行列转置。
枚举不可放车的行集合 ;也即,之前枚举单点的方案中, 中每行必定存在至少一个单点,且每个单点对应的行均出现在 中。
考虑每个连续段。(蒯图)
即,对于每一种颜色,考虑其单独某一列上的情况。
显然这对应了一个区间的行,设为第 行。
设 。
则我们单纯计算两种贡献。
- 当 个格子均不被选择时,有 种选择剩余部分的方法。
- 否则,有 种方法。
这样子容斥,会统计入某些 的情况,使得其中某些行不对应存在原 中元素。
考虑钦定 一部分行 不对应存在原 中元素。
即枚举 ,额外带上容斥系数 。
设 。
再次单纯计算两种贡献。
- 当 个格子均不被选择时,有 种选择剩余部分的方法。
- 否则,有 种方法。
于是贡献即为 。
换言之,答案即为
继续贺题解。
于是考虑树形 dp。
答案柿子是积和形式,尝试运用分配律。
设 ,随便对中间元素分 类讨论一下即可。
JOISC2018I
题解链接。
Xmas21C
题解
zaky 给我们布置的作业题。
导出双射后,这题就没什么难点了啊!bijective problem 还是太困难了一些。
假设我们不考虑 ?
,则有 key observation:
把
0
看作小于号,1
看作大于号,即为将 填入使此不等式组的合法的方案数,也即「LibreOJ NOI Round #2」不等关系。
证明?我不会我不会。
考虑到其实可以强制令 0
段满足先删后面的,1
段先删前面的,填的数表示删除时间。
至于更准确的证明描述,去 EI 博客找了一段来:
证明是很简单的,首先我们发现操作序列等价于每次把某个全
0
段或者全1
段的长度减去 ,考虑每次去掉最大的那个数,这能和删除一个0
或1
的操作序列进行一一映射。
EI 的证明。
似乎没有毛病。EI txdy!
那么的话,?
就相当于不做限制,可以把两侧分开处理,最后组合数分配标号。
因此只用考虑只有大于、小于号的情况。
以下即为对「LibreOJ NOI Round #2」不等关系的分析。
考虑容斥。
我们把某处为 的答案当作此处不做限制的答案减去此处填 的方案数。
我们称 处为 为 ,否则 。
我们假设 表示已经考虑了前 个符号的方案数,初始时 。
dp 时,我们考虑枚举上一项选择为不做限制的位置,得
化一下柿子,我们设 ,即为
也即
设 ,即
显然是一个半在线卷积。
总复杂度即为半在线卷积的复杂度,朴素实现的复杂度即为 ,多叉分治实现的复杂度即为 。
由于时限很足,可以轻松通过。
TBA
题解
TBA
题解
TBA
题解
TBA
题解
本文来自博客园,作者:myee,转载请注明原文链接:https://www.cnblogs.com/myee/p/ATC-record.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?