AtCoder ABC F

FF

81 / 267

*ABC126F - XOR Matching(Difficulty: 1770)#

神奇构造,感觉是能独立做出的。

比较 naive 的情况:若 k2m 显然无解,若 k=0,只需构造回文即可。

其余情况,将 k 放在最中间,两边一层层包着其它数,最后再放上一个 k,就像这样:x,y,,z,k,z,,y,x,k,这样除了 k 以外,都满足条件。那么 k 呢?注意到 k 包住的数字是 02m1 中除了 k 以外的所有数。

而当 m1 时,02m1 的异或和恰为 0,故 k 的条件也满足了。当 m=1 时,容易通过讨论解决。

ABC127F - Absolute Minima(Difficulty: 2003)#

首先修改的 b 没用,然后就是一个每次加个绝对值函数的形式,容易发现这个函数单调,故直接三分即可。

*ABC128F - Frog Jump(Difficulty: 2464)#

这是我最讨厌的一类题。

青蛙每走两次所经过的路程是相同的,记其为 d。则分奇偶列出其路径,如下:

0, a, a + d, a + 2d, ..., a + kd = n - 1
   d,    2d,     3d, ...,

发现这是两个以 d 为公差的等差数列。等差数列的一种思路是调和级数。

枚举 d,则由 a+kd=n1a=n1kd。再从大到小枚举 a,发现当 a 变小时,经过的位置会多出新的 akd(即 n1a),将这些位置的贡献加入即可维护答案。

由于 a 只有 nd 种取值,故总复杂度为 O(nlnn)

还有一步判重。发现每次多经过的点的位置,a 是递增的,kd 是递减的,故重复必定是 akd 相等时,此时要退出,因为以后这个重复位置仍被保留。但还有一种可能:akd 没相等就出现 a>kd 了,这种情况下 a 可能会和 (k1)d 相等,所以还要判这个。

总的来说感觉还是挺好的题。

ABC129F - Takahashi's Basics in Education and Learning(Difficulty: 2621)#

居然没做出来。

容易想到分长度考虑。列出式子,一开始想着能不能把式子拆开算,发现有一部分可以倍增计算,另一部分没法算。

原来直接矩乘就行了。

*ABC130F - Minimum Bounding Box(Difficulty: 2240)#

想了大概十分钟,想加写用了 39 分。写挂是因为没注意题目中方向定义比较反常。

发现在同一个方向上,貌似对一个方向只有 3 个点是有用的:同向移动,垂向移动,反向移动中最靠外的点,因为其它点都不能同类的点。这三种点再取相交的时刻,这些时刻是有用的时刻,总共只有 O(1) 种,对这些时刻暴力计算即可。

看了一圈洛谷发现题解区大多是三分的,不过三分确实容易实现多了。

ABC131F - Must Be Rectangular!(Difficulty: 1937)#

稍微手模一下可以发现貌似最后会形成一个“网格图”,但是有一些点所在的行和列不会在这个网格图中。仔细分析一下,发现一个点 (x,y) 所在的行,第 x 行上有其它点 (x,j),第 j 列有点 (i,j),那么 (i,y) 这个点也会被加入。仔细思考一下,发现每一个点会将其所在的行和列连接起来,如果有多于 1 行和多于 1 列被连接起来,那么这些行列交点处必定会有点。用并查集维护连通情况和行列数量即可。

ABC132F - Small Products(Difficulty: 2143)#

容易发现这样的贡献可以整除分块计算。一开始试图整除分块+动态开点线段树,结果 TLE 了。

首先有一个结论:如果整除分块分出来每一个块左端点为 si,总共有 sc 个块,那么 nsi=ssci+1。好像洛谷题解区有人使用归纳证明法,大概就是:第一个块必定只含 1,第 sc 个块必定只含 n,显然是成立的。而若对于 ijnsi=sj 成立,那么可以说明 nsi+1=sj1 成立。打表或是感受一下。

于是设 fi,j 表示第 i 个数在 [sj,sj+1) 时的方案数,那么 fi,j=k=1scj+1fi1,k

*ABC133F - Colorful Tree(Difficulty: 2330)#

fydj 曾经跟我说过的题。

颜色问题考虑值域分治。对于边中出现次数多于 B 的颜色,只有至多 nB 种,故直接每次 O(n) 求出到根的距离,再求一个 LCA 就可以解决。

而出现次数较少的,先算出原本的距离,枚举每条这种颜色的边,如果在路径中,则加上变化量。

平衡一下可以做到 O(nn)

另一种方法用持久化权值线段树,第 i 个版本维护一个点到根的信息,可以做到 O(nlogn),但这题 105 开 4s 嘛 _

*ABC134F - Permutation Oddness(Difficulty: 2532)#

可能是之前杂题讲了,看到大家都做了,我没做过。这就是偷懒的后果。

想了 3 分钟就放弃了,一个是因为好多人做过,另一个是没什么想法。

套路:

  • 绝对值式子拆贡献,拆成正的和负的。较小的数贡献为负。例如这题里面,考虑为下标和值分配正或负的贡献。

  • 排列本质上相当于有两个 1n 的集合,将两个集合中的元素两两匹配。

考虑从小到大分配贡献,枚举 i,考虑集合 1 和集合 2 中的 i 与谁匹配。有四种情况:i1i2 匹配;都与前面某一个匹配;都与后面某个匹配;一个与前面匹配,一个与后面匹配。

fi,j,k 表示 1i 的贡献确定完了,集合 1 和 2 中各有 j 个要和 i+1n 匹配,总价值为 k 的方案数。

那么转移是不难的。

ABC135F - Strings of Eternity(Difficulty: 2388)#

想了 15 分钟,写了 18 分钟,没调就直接过样例了,结果数组开小 RE 了。

一开始还有点怕这个串串题。发现题目中的复制操作相当于用 ts 上循环匹配,最多能匹配多少段。冷静一下,分 |s|>|t||s|<|t| 的情况考虑。发现对于前者,枚举 t 的开头与 s 的哪个位置匹配,然后可以递推,后者只需要复制几份 s 转化成前者即可。

其实不难。

ABC136F - Enclosed Points(Difficulty: 2334)#

这题是紫色的?(笑)。25 分钟以内过了。

这种问题很经典地反过来考虑,考虑每一个点会被哪些矩形包含。直接考虑也不太行,考虑容斥。假设每一个点被 2n 种点集包含,考虑减去不包含这个点的情况,即集合中的点都在这个点一侧。但是这样左上、左下、右上、右下会被算重,所以需要再加上。

用一些东西求出每一个点一侧,左上等方向的点数,很容易求。

*ABC137F - Polynomial Construction(Difficulty: 2402)#

神仙构造。

给定素数 p,序列 a,要求一个至多 p1 度的多项式 f 的系数 b,使得在模 p 意义下 f(i)=ai0ai1

看到的时候想着直接拉插是不是就做完了,但是我没写过求系数的拉插,也不知道咋写。看了下题解,给出了一种高妙的做法。

由于 a 的取值只有零一,构造妙妙函数 g(i)=1(xi)p1,这个函数在 x=i 时取得 1,其余时候因为费马小定理,取得 0。如果 ai 等于 1,就将 gi 加上即可,求系数直接暴力展开。

*ABC138F - Coincidence(Difficulty: 2431)#

几乎要想出来了。

感觉这个取模和异或就没啥关系,怀疑是不是诈骗。所以先考虑若 (x+t)modx=t 的情况,这种情况下,容易发现,(x+t)x=t 的充要条件是 t1 的位置 x 必须为 0,即不存在 x+t0 但是 x1 的情况。

当时想到进一步推广到 (kx+t)modx 的情况,但是感觉乘了一个 k 比较复杂,不太会做,就看了题解,发现不存在 k>1 的情况……具体来说,若 a>b,则 abab 显然成立,故 (kx+t)x(k1)x+t,当 k>1 时不可能等于 t

所以只需要考虑 (x+t)modx=t 的情况。设新的 xx+t,新的 y 为原来的 x,即 xy=xy,限制是 yx<2y,由于充要条件中 x0y 不能为 1,这两个条件使得 xy 最高位必定是相同的。(证明考虑若 y 全为 1,由于 x<2y,所以如果 x 最高位与 y 不同,则低这些位必不能全为 0,与第二个条件矛盾。若 y 中有 0,找到一个最靠左的 0,假设是第 i 位,那么 i+1 这一位必定是 12yi+1 位是 0,与第二个条件矛盾)。好绕啊 T_T。

总之就是,第一,只有 xmody=xy 的情况,且 yx<2y;第二是 xy 的最高位相同。然后就可以数位 DP 了。

fi,0/1,0/1,0/1 表示填了高 i 位,y 是否等于下界,x 是否等于上界,已经填的位置是否都为 0,容易转移。

*ABC139F - Engines(Difficulty: 2034)#

结论题。

将所有向量按照极角排序,那么最后一定会选定一段区间。证明考虑如果中间有一个向量不选,将这个向量选上一定不劣。

直接暴力可以做到 O(n3),简单优化可以做到 O(n2)

然而有一个更强力的结论:最后选定的向量在一个平角内。证明:假设确定了最后方向,那么所有与这个方向相差不超过 90 度的向量选上一定不劣。比如说最后想往 x 的正方向走,那么将所有 xi0 的向量选上肯定不劣。

有了这强有力的结论,可以直接双指针维护。但还有一个神秘做法:将所有向量的反向量加入,扫到反向量时删除,这样就不用手动维护了。

ABC140F - Many Slimes(Difficulty: 2105)#

贪心题,被任意难度的贪心卡死。

容易想到尽可能用较大的史莱姆。所以就写了一个 dfs,每次选一个最大能选的史莱姆,然后 WA 了。仔细想想,这样可能在递归左儿子的时候浪费了较大的史莱姆,导致右儿子没得选了。

所以要换成 bfs,就能过了。

ABC142F - Pure(Difficulty: 1919)#

BFS 都不会了。

容易发现题目要求找一个环,但是有一个神秘限制:环点为点集的导出子图必须是一个环。没有意识到本质是找最小环。

最小环都不会找。直接选定一个终点 x,将终点的出边的 dis 设为 1,然后 BFS 跑一跑,最后 dis(x) 就是环长。

*ABC143F - Distinct Numbers(Difficulty: 2277)#

之前模拟赛好像做过一道很类似的题目,想用那个题的方法。大概就是直接线段树维护每一个数有多少个,用一点 trick 就可以维护。由于每一个 K 最多只能跑 O(nk) 次,所以总共是调和级数。应该也能做,但是是双 log,而且很难写,不知道能不能过。

正确的想法是:正难则反。

考虑一个操作次数能够贡献哪些 K。假设操作 x 次,数字 i 出现了 ci 次,那么每一个数字被操作恰好 min(ci,x) 次。显然这是上界。取到上界只要每一次选择这 x 次操作中,操作数字最少的都操作一次 i。这样 x 次操作中,操作次数的最大值与最小值只会相差 1,能够取到上界。

则能够贡献的最大的 K 就是

min(ci,x)x

min 拆开,用前缀和和后缀和维护一下就可以 O(1) 计算这个式子。由于答案显然单调不升,所以直接双指针维护 x 即可。

ABC144F - Fork in the Road(Difficulty: 2189)#

没想到结论。朴素地枚举每一条边删除再 DP 容易做到 O(m2)

但是如何优化呢?这时候不要考虑优化,考虑缩小枚举边的范围:对于一个 i,只枚举出边 (i,j) 中,DP 值最大的 j 这一条边。因为删去一条边只能影响入点及入点的前驱。对于入点,肯定是删去最大的 DP 值最优。对于入点的前驱,入点的 DP 值越小越好,所以结论成立。

ABC145F - Laminate(Difficulty: 2116)#

水题。直接离散化然后 DP 一下,前缀和优化一下即可。

瞄了一眼洛谷题解区,感觉我的做法很劣。我设了三维的状态,其实有一维是不需要的,因为每一个 hi 只会修改成其前一列的高度,我没有发现这个结论。并且这个东西应该可以进一步用 DS 优化。

ABC146F - Sugoroku(Difficulty: 1545)#

不知道是懒得思考还是为什么,连青题都不会了。

由于每一次可以走的步数是 1m,所以尽可能走到更前面不劣,因为移动的下界是 1。那么每一次就走到能到达中最后一个 0。但这样是字典序最大的。由于这题里,最短方案中,所有数字和是一定的,所以最大字典序就是反串的最小字典序。

*ABC147F - Sum Difference(Difficulty: 2393)#

没想到啊。感觉还是很好的。

首先容易注意到,若 U 为所有数字之和,则 ST=S(US)=2SU,所以只需要计算有多少个不同的 S 即可。

等差数列通项为 ai=x+(i1)d,假如从中选了 t 个数,那么总和就是 tx+sd,其中 si1 的和。

到这里我就不会了。

考虑 s 的取值范围,下界是选下标最小的 t 个,上界是选下标最大的 t 个,而且在上界和下界之间的值都能取到(为什么),故 s 的取值范围是 [(t1)t2,(2nt1)t2]

但是可能会有形如 tix+sid=tjx+sjd 的情况,这时候会算重。考虑出现这个情况的必要条件:(titj)x=(sjsi)d,也就是说 d(titj),即 titj(modd),的情况下才可能算重。将 t 按照对 d 取模的余数分类,一起处理同一个类中的。

考虑对于一个 t,总和的取值范围是 [(t1)td2+tx,(2nt1)td2+tx],为了便于判重和计数,上界和下界同时除以一个 d,由于所有 td 取模同余,所以除以 d 前后相同的仍然相同,不同的依然不同。这样计数只要对所有区间求并集,并集的大小和就是答案。

ABC148F - Playing Tag on Tree(Difficulty: 1457)#

大水题 (我不会告诉你我直接看题解了)

求出两人到某个点距离,如果先手距离小于后手,那么用后手距离更新答案。

ABC149F - Surrounded Nodes(Difficulty: 2208)#

水题。拆贡献。考虑每一个点是白色的时候有多少种方案使得这个点被黑色连通块包含。

ABC150F - Xor Shift(Difficulty: 2281)#

不难。发现如果满足题目的条件,那么 a 相邻两数的异或值等于 b 相邻两数的异或值,然后差分,KMP 匹配,没了。

ABC151F - Enclose All(Difficulty: 1671)#

模板题。求最小圆覆盖。应该可以直接退火乱搞过,毕竟数据范围这么小。

最简单的暴力做法是枚举两个点或三个点,再暴力判断形成的圆是否包含所有点,时间复杂度 O(N4)

改进的方法是:增量构造。维护一个当前的答案圆。从 1n 枚举一个 i,如果点 i 不在圆上,那么将圆更新为仅包含 i 点的一个圆。然后从 1i1 枚举 j,若 j 不在圆上,那么将圆更新为 ij 为直径的圆。然后从 1j1 枚举 k,若 k 不在圆上,那么将圆更新为 i,j,k 三点的外接圆。

这样做是正确的,考虑若加入 i 时,i 不在最小覆盖圆内,则 i 一定在新的最小覆盖圆上。剩下两重循环应该是同理。

这样是 O(n3) 的。

但是可以证明,随机点的顺序之后期望复杂度为 O(n)

这样就可以通过 P1742 最小圆覆盖

实现时直接用斜截式很方便,但是随机旋转一个角度防止斜率不存在。

ABC153F - Silver Fox vs Monster(Difficulty: 1393)#

纯纯水题。贪心地,从左到右考虑,如果当前怪兽还有生命值,就需要一些炸弹,贪心地将炸弹放在当前怪兽的下标加 d 处,可以用一个单调队列来维护炸弹信息。

ABC154F - Many Many Paths(Difficulty: 1775)#

求从 (0,0) 走到一个 (r,c),满足 rR,cC 的方案数。有结论,答案是 ((R+1)+(C+1)C+1)1,即等于从 (0,0) 走到 (R+1,C+1) 的方案数减一。证明考虑构造双射,将最后一个转折点后面的部分删除即可。由于从 (0,0)(R+1,C+1) 的路径有两条,这两条路径实际上对应着同一种方案,所以要减去 1.

*ABC155F - Perils in Parallel(Difficulty: 2738)#

一眼看过去,除了线性基没有别的想法。

由于是区间操作,所以可以差分后转化为两个点翻转,目标是使得所有点为 0

由于是点对问题,考虑建图。如果图中有环,环上的边全选等于不选,断掉环上任意一条边都是等价的。所以可以考虑求出一个生成森林,然后在生成森林里面进行树形 DP。

fx 初值等于初始差分后的值,fx 先异或上所有 fy,如果一个 fy1,那么 (x,y) 这条边是要被选中的。

如果根是 1 则无解。但是有一个特殊情况,n+1 这个点的值其实没有要求,所以先以 n+1 为根做完 n+1 连通块的,再做剩下的。

*ABC156F - Modularness(Difficulty: 2150)#

完全没有想法。

这样的形式显然是要找循环节。但是模之后小于这个限制不好刻画,正难则反,容斥成求等于和大于的。

等于的是容易的,只要求 di=0 的个数。考虑大于的,先将所有 dm 取模,这样对答案没有任何影响,但是,这样每一次加法之后,如果结果大于等于 m,就会产生贡献,可以视作为一个 m 进制数的进位过程。每一次最多向前进 1,所以求出 dimodm 的和 s,那么 sm 就是贡献的次数。

+ABC157F - Yakiniku Optimization Problem(Difficulty: 2525)#

计算几何题,求两圆交点,不会,直接退火。被卡。乱搞,直接表出答案作为初值,水过去了。

ABC158F - Removing Robots(Difficulty: 2067)#

感冒了,太难受了,没有想出来。

按照 x 升序排序。设 DP 状态 fi 表示后 i 个机器人的答案。则 fi=fi+1+fnxti+1,这里 nxti 是第 i 个机器人激活之后最远的不被激活的机器人编号。fi+1 代表了不选这个机器人的答案,fnxti+1 表示选这个机器人的答案。

ABC159F - Knapsack for All Segments(Difficulty: 1876)#

水题。设 fi,j 表示到第 i 个和为 j 的方案数。fi,ai 赋初值为 i 即可考虑所有左端点,在每一个右端点统计答案。

ABC160F - Distributing Integers(Difficulty: 2048)#

亦是水题。题目等价于确定一个树上染色顺序,要求每一个时刻染过色的是一个连通块。直接 DP 计算方案数。对于多个根只要简单换根即可。

ABC161F - Division or Subtraction(Difficulty: 1528)#

水题,竟然做了 20 分钟,太失败了。

观察一下,减法不会改变对 K 取模的结果。这意味着一但执行减法,以后就不会执行除法操作了,并且执行减法的时候 NK 取模的结果为 1,不难发现形如 Kt(Kx+1)=NK 都是合法的。对于 t=0 的,即其为 N1 的约数,统计 N1 的约数个数即可。对于 t0,枚举 N 的约数计算即可。

🍭ABC162F - Select Half(Difficulty: 1764)#

偶遇黄题强如怪物,拼尽全力无法战胜。我直接 D 题解了。

ABC163F - path pass i(Difficulty: 2470)#

爆切紫题 _ 虽然说不是正解

正难则反,用总的点对数减去不经过任何颜色 i 的点对数。发现相当于在所有颜色 i 的点处断开,剩下每一个连通块中任意选两个点都不会经过颜色 i。考虑线段树分治,每一个边在除了其端点颜色的位置插入,用可撤销并查集维护一下就可以了。

看来我做复杂了,但是跟 zlt 想到一块去了。有线性做法,口胡一下:记录 si 表示颜色为 i 的点的子树大小之和(如果存在包含关系,只记录较大的),对于一个点 x,统计颜色 cx 的答案。在递归儿子 y 之前记录 t=scx,递归完之后 scxt 就是这个连通块的大小。

ABC254F - Rectangle GCD(Difficulty: 1764)#

思考用时 6 分,调了挺久。

由于有加法,很不好弄。尝试找一些性质。发现同一行里,ai 一定,假设对所有 j,需要 gcdg,则 gai+bj,故有 bjai(modg),故所有 bjg 取模是相等的。同理 aig 取模相等。这种对某个数取模相等的,只需做差就可以去掉。即,若 a 的差分数组为 c,则 g 必定是 cl+1cr 这数的 gcd 的因数。

所以维护 ab 的差分数组(绝对值)的区间 gcd 即可。(查询时还要对 ax1+by1 取模,因为那是必要条件)。

括号是出错的地方。

ABC389F - Rated Range(Difficulty: 1642)#

发现如果将初始 Rating 排序之后,由于 Rating 变化都是 1,那么每一个时刻 Rating 都是有序的。所以用线段树维护,每一场比赛在线段树上二分找到在范围内的,然后区间加一即可。

ABC390F - Double Sum 3(Difficulty: 1801)#

套路:代表元。

竟然连绿题都不会做了?

每一个区间的“值的段数”,这个东西很难刻画。所以使用代表元,即用每一个段中最大的值来代表这个段,那么只需要统计每一个位置被作为代表元的次数和即可。

当一个数 x 出现而 x+1 没有出现,我们认为 x 是代表元。但是当 x 在区间中出现多次时可能会算重,所以规定一个出现的 x 为代表元。对于每一个 ai 处理出前面最靠后的一个 aiai+1 的位置,后面最靠前的一个 ai+1 的位置,就能统计答案了。

ABC394F - Alkane#

水一个 AC Count 并且填满最近 28 场的 F 题

大水题。乱 DP 一下就能过。

作者:Terminator-Line

出处:https://www.cnblogs.com/Terminator-Line/p/18729424

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Terminator-Line  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示