AT_agc027_f
一道比较神经的题,很好地延续了 AT 的风格。首先判一下两棵树是不是完全相同,如果是的话就直接返回 。既然两棵树不相同就枚举第一步的操作是什么,假设移动的是点 ,那么显然这个点在后面的所有移动中都不会再动了(题目中说了一个点只能被移动一次),于是可以以这个点为根把两棵树都变得有根。发现一个点应该被移动当且仅当它在两棵树中的父亲不一样,把这些点标记出来,如果孩子没有标记父亲有标记直接不合法返回即可。然后就涉及到顺序的问题,由于题目中的定义, 树中父亲应该比自己后移动,而 树中的父亲应该先移动到正确的位置上,于是就可以连边了。最后跑一下拓扑排序,如果有环说明不合法,否则返回有标记的点的个数即可。
启示:这种求步骤最少的题目可以考虑枚举第一步具体是什么然后把问题转化成一个限制更深的版本。
AT_agc034_c
挺不错的一道题。首先发现 是具有单调性的,所以可以二分它。然后思考对于一个确定的 如何找出最优的方案。感性理解会发现一个位置只会取到 或 ,也就是说数列中至多有一个数在 和 之间。可以证明一下,假设有两个数 同时没取到 ,那么其中一定有一个比另一个系数更大(就算相同也是适用的),那么把一个数挪到另一个数上一定会更优,所以归纳下来就得出了那样的结论。而此时的 是确定的,也就是说整个数列都是确定的。会发现其中那个游离的数是特殊的,所以只需要枚举它的位置,剩下的位置贪心取即可。复杂度我觉得是 ,因为 的上界是 级别的。
AT_abc034_d
一道非常板的题目。直接做不好做,这个分数的形式让人想起类似分数规划的思想。于是二分最后的浓度 ,于是最后希望的就是找到指定的盐水集合 满足: ,也就是说 ,到这一步就可以贪心地去取了,复杂度两只 。
AT_abc020_d
把后面那一堆拎出来反演可以得到:
然后可以快速求得。问题在于如何知道 的值,只需要先求大概 的 ,然后大于这个值的 可以想到不会太多,所以暴力去算就可以了。一个需要注意的地方就是考虑到 的实际含义是 ,所以显然有 ,需要特殊处理一下。令 表示 的因数个数,那么复杂度是 。
AT_agc010_e
首先分析如果有一个固定了的数列,第二个人应该使用何种策略得到字典序最大的序列。会发现有一个性质是说对于两个数 ,那么无论如何交换两个数的相对位置都不会变。于是可以把原来的序列分成一些集合,集合之内有顺序,每次从所有集合中找到第一个元素最小的那个集合,然后输出这个元素即可。于是可以思考第一个人如何构造序列。想到把不互质的数用无向边连起来,于是我们需要给这些边定向,并使得每个连通块最大的拓扑序最小。贪心即可,每次找到最小的数,然后深搜遍历即可。最后的最后在重新加边的图上跑个拓扑排序即可。复杂度 。
AT_abc203_f
首先一个东西就是说这玩意是不具有单调性的,然后它最优决策也并不是单纯删后缀,所以不能二分。在样例三卡了半天却仍然不知道自己错在哪,傻逼。然后答案就呼之欲出了,由于最后的魔法次数不会太大,用 代表前 个数操作 次最少删的数量,转移显然就两种,自己没当过最大的和当过最大的两种,转移即可,途中动态维护一下转移点即可。
AT_abc133_f
首先发现这玩意是可以差分的,这个变化并不会破坏一些常用的性质,所以可以把它套路地拆成 。而对于一个特定的点 ,维护到根路径上的某个颜色是数量和权值和是简单的,用可持久化线段树即可。然后就做完了。
AT_abc134_f
比较妙的题。首先把绝对值的柿子具象化成这样的形式:左边有 个球,右边有 个盒子;然后每个排列对应一个放球方案,于是球和盒之间连线,于是那个柿子的值等于这些线和水平线的交点个数。于是可以用 代表前 排,有 对还没连线,且目前交点个数是 的方案数。考虑当前这根水平线会产生多少的贡献。有个显然的结论是说 这一维其实和第 排的决策没有关系,因为跨越该水平线的线段肯定满足一个点在水平线上一个点在水平线下。于是 这一维的变化量肯定是 ,所以唯一需要讨论的就是 这一维的变化。
自然以第 行的决策为基础分类讨论。如果自我消耗,显然失配数不变,系数为 。如果一个物品往回连,失配数显然也不变,系数是 (事实上上面两种情况可以归成一类)。如果两个物品都往回连,失配数减一,系数是 ;如果两个物品都不连,失配数加一,系数是 。正常转移即可更新答案即可。
AT_abc126_f
一道比较妙的题。首先对于 的询问是无解的,然后思考较小的是不是都有解。然后有一种神仙的构造方法是说如此排列: ,会发现对于 显然是合法的,而对于 ,会发现由于数集的特殊性会有 ,所以发现 仍然是合法的,所以这种构造是正确的。
AT_abc136_f
把计算矩阵的贡献转化成计算点的贡献,也就是计算有多少个集合对应的矩形是包含当前点的。包含这个点的集合一定是合法的,答案是 。然后就考虑不包括这个点的方案,显然答案集合应该包含左上点和右下点,或者包含左下点和右上点。于是答案分别是 和与之相对应的柿子。当然要容斥减去一部分。至于四个象限的点数可以用排序解决掉一维,然后用树状数组维护第二维即可,复杂度 。
AT_abc149_f
和上面一道题一样把贡献转化成计算点的贡献,考虑一个点产生贡献必须满足两个条件:一个是自己本身是白点,另一个是以这个点为根重新建树之后不少于两个孩子的子树内都有黑点。于是直接整体减空白一下即可,复杂度显然线性。
AT_agc001_e
题意:求 。 的值域比较小。
比较妙的题。首先想到 的常用含义,即从 走到 的方案数。所以可以套用到这道题上,把 看成是从 走到 的方案数。但是点数大概率是 的,承受不了。于是把方案转化成从 走到 的方案数,于是可以出现许多个起始点和许多个终止点,希望求从任意一个起始点到终止点的方案数,一次 DP 最后统计即可。然后有去掉相同点的贡献以及除以二什么的就不说了。
AT_arc106_f
题意:有 个点,每个点有 个接口,每个接口两两不同,一个接口只能连一条边。求生成树的方案数。
首先根据 prufer 序列会发现树的形态应该是 ,然后乘上接口的方案会得到:
求后面那一堆的生成函数如下:
然后答案就是:
中 次项的系数。分析一下,前面一堆已经定下来了,而且由于有个 ,问题转化成求 的 次项系数。显然答案等于 ,暴力计算即可。最后再乘上前面的 即可得到答案,复杂度显然线性。
AT_agc031_e
由于取的宝物最多的时候并不一定是取的价值最大的时候,所以不能二分,而需要枚举选择的宝物数量,设为 。然后呢可以转化每个限制,考虑一个形如 维度上大于 的宝物不超过 个的限制,等价于限定了前 个宝物的 坐标都不大于 。由此可以暴力求出按 排序之后每个位置在 维度上的限制,然后每个排位可以向合法的宝物连边。宝物由于只能选一次,拆点限流的同时加上价值即可。 维度上也是同理,最后跑费用流即可。最后要判一下跑出来的最大流是不是刚好等于枚举的 ,以防止一些不必要的事情发生。
AT_agc024_f
考虑枚举每个串,然后考虑它是哪些串的子序列,想到子序列自动机的方法。用 代表已经匹配了 ,并且后面还有 的方案数,考虑如何转移。转移就是考虑在 的后面加点什么,如果是 就在 中找第一个 ,否则就找第一个 ,当然也可以直接停下统计答案。
AT_arc141_c
很好的一道题。
首先对原括号序列画折线图,具体方法就是如果是左括号就往上走,否则就往下走。试想,如果整根线一直都在水平线上方,那么一定存在一个序列 是合法的,也就是说此时数组 也一定等于这个值。然而不总是这样的,这是因为折线图还有低于水平线的部分,对于这部分容易想到在此之中左右括号数量相等(这样才能刚好升到水平线上),所以策略是找第一个左括号然后找第一个右括号,交替进行直到把折线又拉回到水平线上为止,所以我们得到了一个非常重要的结论,如果 的话,那么 对应的位置应该是左括号, 对应的位置应该是右括号。同理,会发现数组 决定的是水平线以上的部分,两个部分合并起来应该就是完整的数组,所以如果看到重合或者未覆盖的地方就说明不存在合法解。最后求出答案之后验证一次就可以了。
AT_arc132_c
由于 很小,可以用 表示已经安排好了前 个位置,并且 上下 个数的使用情况为 的方案数,转移是很显然的,状压即可。
AT_agc002_f
影响里很久之前就看过这道题,但不知道为什么没去写。
显然题目条件转化成任意前缀中白球数量不少于其他颜色的颜色数量,于是用 表示已经放了 个白球和 种其他颜色的球,并且考虑的一定是当前第一个空位上,这就意味着之前放的所有白球都在当前位置的前面,状态就是足够的。转移是简单的,放白球转移到的点是 ,放其它颜色转移到的点是 ,转移系数是 ,预处理组合数正常转移即可,复杂度 。
AT_agc036_d
首先思考没有负权环意味着什么。发现没有负权环意味着 号点到所有点都是有最短路的,而根据题意中间那些贯穿始终并且边权为 的边是不能删除的,也就是说这些点可以分成一些段,每一段之内的点最短路相同,并且后面那一段恰好比前面那一段的最短路多了个 。于是用 表示 点对应的边已经考虑了,并且上一段是 使图合法的最小代价,考虑转移,枚举上一段 ,于是形成了两个段 和 。考虑 边,发现这种边不应该在段内出现,否则会更新最短路,剩下的贪心不删;考虑 边,会发现这种边不应该跨越两个以上集合,因为这样会形成一个至少是 的负环,显然不合法,剩下的贪心取即可。用前缀和可以实现 计算代价,复杂度 。
AT_agc036_e
一道比较神秘的题目。首先去重,然后假设剩下的字母中 A 最多,C 最少,然后发现假如把 C 看成一系列的分界线,那么相邻的 C 之间必然是交错出现的 AB。剩下的部分分两步走,一步是考虑通过消除 A 使得 AB 数量相同。考虑不特殊的情况,发现有一些 A 是可以直接消除的,比如两边的和中间的一些。但是也存在 A 过于密集无法消除的情况,让它和 B 一起消掉无法达到效果,于是只能让它和 C 一起消除。于是到这一步我们使得 AB 数量相同,最后要做的就是不断地消除 AB 对使得其数目与 C 相同,直观上显然可以发现直接消除就可以了,也就是一定存在合法的方案。有一些细节。
AT_arc134_e
一道真的牛逼的题目。根据一堆分析会发现如果当前局面并不是全都是 倍数时先手总能找到合法的方案必胜,然后其它局面又比较少,由于 的倍数只有 个,考虑此时的情况。如果我们选择了一个数使得余数有非 倍数的数,那么效果等价于让对手达到必胜状态,肯定不会被采取。于是发现这些情况下当前人的决策后数的集合仍然是前面的那个集合的子集,所以可以直接状压递推暴力去做。方案统计是比较简单的。
AT_agc047_e
感觉上并没有那么难,只是有些细节需要注意。
考虑到这道题给的操作次数限制比较宽,我们可以使用比较朴素的方法来解决,即考虑把 分别进行二进制拆分(令 从低到高第 位是 ),然后枚举一对 ,如果 和 都是 ,那么给答案加上 ,否则什么都不干。然后来分析为了实现这个框架我们需要做什么。
首先是如何凑出 ,这是比较简单的。首先假设我们有一个 ,那么我们只需要重复 次 即可(也就是后面代码中的 make 函数)。那么如何得到 呢,大概分类讨论一下。如果 ,那么容易发现任何操作都无法制造出 ,也就是说最后 一定是 ,恰好是正确答案;如果 ,那么容易令 得到一个 ,于是就解决了这个问题。
然后思考如何对一个数进行二进制拆分。最高位是很好判断的,如果 ,其中 是位数的上限,那么显然可以发现 的这一位是 ,否则就是 。但是剩下的位置并没有那么好判断,因为我们并不能给上面的 减去已经匹配的二进制位,但是可以反向思考,我们可以给当前匹配的 加上前面已经匹配的数,如果和仍然小于 ,那么说明 这一位是 ,更新那个匹配的和,随便维护一下即可。于是我们就得到了两个数的二进制拆分。
最后一步是简单的,就考虑枚举 ,如果 ,那么说明应该加上 ,否则就什么都不干,很好实现。
可以发现总的操作数是 的,可以通过。
AT_agc041_d
其实没有那么难,只是背包那里的转化比较巧妙。
对于一个特定的 ,为了让条件尽量不符合,显然是取前 个数以及后 个数。但这样限制还是比较繁杂,考虑当 逐渐变大时限制的强弱是如何变化的。显然在前半部分,由于前半部分加入的数严格小于后半部分加入的数,所以限制其实是在逐渐变强的;但是可以想到当过了一个临界点之后,限制就会逐渐变弱,可以发现 的时候是限制最强的,于是问题就变成了需要构造一个前 个数的和大于后 个数的和的序列。
记前面的数减去后面的数得到的差值是 ,思考修改每个位置会对它产生什么影响。由于题目要求序列是不降的,所以序列可以看成是一个全 的序列做后缀加或者一个全 的序列做前缀减,发现后面的转化具有一个性质,即任意前缀减对 的影响都是负的。而 初值就是 ,所以可以使用背包,物品就是这个位置对 产生的影响,背包上限就是限制 ,做一个完全背包即可。然后还有一个就是物品数量不能超过 ,但由于不存在空间为 的物品,所以这个限制可以忽略。复杂度 。
AT_agc043_d
一个比较妙的题。这玩意可以粗略地看成是一个归并排序,即有一些集合,每次从所有集合中选出最小的点输出,然后挪动指针到下一个位置。但是由于它集合内部并不是有序的,所以它最后输出的序列也不一定是有序的,也就是说可能存在一些子段是降序的,可以想到它们应该属于同一个集合。所以问题就变成了希望把原数列分成一些大小为 的集合,并用它们凑出一个合法的目标序列。有显然的构造方法,即集合内部把最大的放第一个,剩下的随便排,然后集合之间按最大值升序排列。而由于原序列是恰好 个大小为 的序列,所以大小为 的集合应该不少于 的,否则就无法凑出合法初始序列了。
用 代表已经用了 个元素,并且 集合减去 集合的差值恰好为 的方案数。然后更新转移即可。
AT_abc221_g
一道感觉上比较套路的题目。只往一个方向显得比较难受,考虑把坐标轴旋转 度,这样向上走就相当于在两个方向上都加上了 个单位长度。于是问题就变成了是否存在一个只包含 的序列 满足 。理论上就可以直接做了,但空间似乎会出问题,于是考虑给 加 ,然后 就应该加上 ,然后可以除以二得到一个 01 背包,用 bitset 优化即可。好残暴的想法。
AT_agc009_c
感觉上也比较套路。考虑用 代表集合 A 中最后一个点的位置是 ,考虑如何转移。显然枚举上一个点的位置,然后思考是否合法。合法的点 需要满足两个条件,一个是 ,一个是 ,这里有个小的点就是说并不需要考虑 和 的大小关系,因为如果存在三个相邻的数如此这般不合法那么根据鸽巢原理它们又必须有两个分在同一个集合内部显然此时答案是 。最后发现两个限制前者合法的一定是一个前缀,后者合法的一定是一个后缀,两个指针维护一下求个交集即可,复杂度线性。
AT_agc009_e
具有启发意义。首先把取平均数的过程看成是一个树形结构,那么假设一个叶子本来的价值是 ,其深度是 ,那么它对根节点,也就是最后最后的平均数的贡献是 。于是问题就变成了询问有多少个合法的有理数 ,使得 可以表示为 个单位分数之和,并且 可以表示为 个单位分数之和。把 表示为小数的形式,假设不考虑进位,也就是说当前某一位的数就是这个深度下 的叶子个数;但是考虑到可能要进位,所以当前数字和应该是 ,换句话说实际上的 ;相似地考虑 的情况,其数字和应该是 ,也就是说我们需要的是 ,做一个背包即可,其中用前缀和维护一下。复杂度 。而为了讨论得不重不漏,我们考虑在这个小数的最后一个非 位进行讨论,也就是贡献的时候强制这一位不是 即可。
AT_agc019_f
感觉是一个经典的题目。由于每一步操作是相互独立的,所以大概的策略是看剩下的问题中是正确的多还是错误的多,贪心地选择多的那个进行回答,容易发现这样显然可以获得 个正确答案。唯一的例外是当 ,此时发现有一半的概率获得正确答案,于是问题就变成了一条路径期望经过多少次这样的点。把问题转化成每个这样的点被多少条路径所经过,答案显然是 ,然后除以二倍总的方案数就可以啦。
AT_arc133_d
显然 的值可以通过分类讨论简单得出。答案大概分成三段,一段是中间,其值是一堆 异或起来的值;一段是左边,如果左边是奇数会有一个贡献;最后一段是右边,如果右边是偶数也会有一个贡献。于是分类讨论,如果两端都没有的话比较简单。如果只有一端有值的话也可以分类讨论一下就可以得到答案。最后就是两边都有值的情况,相当于希望找到两个数异或起来等于给定数或者其异或一,可以数位 DP 得到答案。但是我并不想写。
AT_agc029_f
钦定一个根,发现每个集合刚好对应一条树边,其中一定有一个是另一个的父亲。发现我们只需要把每个集合和其中的一个点对应起来就可以得到一组合法的方案,具体方式是选定一个根,然后通过广搜的方式选出那些存在已经在当前树中点的集合,然后将这个集合对应的点连到任意一个树内的点中即可。于是跑二分图匹配即可。
AT_arc158_e
本来是一个非常傻逼的题目但是场上不知道为什么方向走错了。考虑分治,显然可以 暴力求出中心点到任意一个点的最短距离,设上面那个点到某个点的最短路是 ,下面的是 ,左右两边各是 ,需要注意的是右边的边权不包括中心上的点权。然后考虑两个点的最短路在哪里会合,发现他们在上面那个点会和当且仅当 ,排序之后发现决策对应的一个前后缀,二分维护一下即可。总的复杂度是 ,应该会有更好的复杂度。
AT_arc128_d
显然用 表示前缀 并且保留了点 的方案数,最后的答案显然是 。然后考虑合法的转移点,显然应该满足其中不存在相同的数相邻,然后还需要满足不同的数不少于两个,这是显然的。然后似乎就没有什么了,猜测他是充要的,于是维护两个指针对应两个限制,前缀和维护一下即可,复杂度线性。所以说要敢于猜结论呢。
AT_abc270_g
八百万年没有写过 AT 的题了,比较悲惨。感觉似乎也不是什么难题,考虑暴力拆开那个柿子。
BSGS 暴力去做就可以了。
AT_abc236_g
的数据规模就很像矩阵快速幂的模型,考虑用 表示当前时间下从 到 需要经过的编号最大的点,于是有 ,然后用广义的矩阵快速幂去计算就可以了。
AT_abc230_g
感觉上是一道很强的题。
外面先套一层容斥,然后问题就变成了有一些数,求不互质的数对的数量。正难则反,考虑求互质的数量。记每个数的数量(也就是是否出现过)为 ,那么有:
考虑对每个 求贡献,那么每个新加入的数直接暴力遍历所有的因数更新即可。理论复杂度似乎高于 ,但容易想到剪枝可以剪去很多无用计算,于是就可以通过了。
AT_arc111_e
一道多多少少有点用的题目。
会发现当 时,肯定会有不合法的数存在;而当 时,每个区间中不合法的数肯定不会超过一个,等价于两边除以 不相同,等价于其差一。于是被减数和减数分别进行计算,于是需要求的柿子大概就是这样子的:
用类欧求就可以了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】