AtCoder 杂题乱写

AGC020E

固定字符串时可以使用区间 DP 来求解:

fl,r 表示对 [l,r] 对应的子串任意操作得到的字符串总方案数,gl,r 表示将区间最外层套上括号的方案数,特殊处理 g_{i,i}=s[i]+1

对于 f 的转移,考虑枚举第一段被套上括号的前缀;g 的转移就是考虑周期长度,由于可以嵌套,仍然需要子区间的 f 值来转移。形式化地:

fl,ri=lrgl,ifi+1,rgl,rd|(rl+1)[s[l,l+d-1] is a period of s[l,r]]fl,l+d1

对于全部子集的 DP 类似,设 fS 表示 S 的全部子集的生成子串数量,gS 是周期划分得到的生成子串数量

转移 f 和上面完全一样,但是转移 g 的时候要对所有段取 and 再调用 f

时间复杂度?官方题解里面介绍了一个做法:

Run your solution on cases of maximum length with different number of ones and see that it is very fast.

一种可能的状态数上界是 Θ(212+n3),并不会证明

ARC100F

正难则反,用总出现次数 knm×(nm+1) 来减掉在非合法序列中的出现次数

那么如果给出的序列本来就是合法串那么直接输出,注意这里判断合法与否要逐个区间判定

其余分以下两种情况讨论:

  • 序列中的数字可能相同:注意到形成长度为 k 的子段不会跨过给定串,所以分开来前后缀分别处理

    以前缀为例:设给定串最长互不相同前缀的长度为 l,那么设 fi,j 表示接到前缀前面的串长度为 i 时,目前极长的互不相同后缀长为 j 的方案数,初态 f0,l=1

    转移考虑枚举最后一个位置填什么字符,按照 ACAM 的想法断点可能是 1j 中的某个数字,用前/后缀和优化;新填入数字的方案是 jk+1

    统计结果枚举前缀接上的字符串长度即可

  • 如果序列中的数字互不相同:使用上面的方式计算序列数,另开 gi,j 在长度为 i 且目前极长的互不相同后缀长为 j 的情况下,长度为 m 的互不相同数字段 的出现总次数,那么最后统计 gn,ikm_

    f 的转移同上,根据实际含义,一个位置的出现要乘序列数量是为总出现次数,g 自己转移给自己的情况和 f 同,而互相转移(添加一次出现)的方式是对位做加法

AGC019F

称还剩 n 个题答案为 Yes,m 个题答案为 No 的为一个局面,记作 (n,m)

所谓最优策略就是对于任意局面 (n,m),选择较多的一个猜,即 nm 时猜 Yes 否则猜 No

直接根据上述策略计算路径条数即可做到 Θ(nm) 但是我们并不满足于此(看 Luogu 题解区有直接优化这做法的十分佩服)

使用实际含义考察这个过程,将每个答案排列视作坐标系上的折线,经过的点就是对应的局面,如果有在 y=x 上面的折线部分就翻转下来

那么每种排列都和所选择的策略有 max(n,m) 段交线,这部分一定在答案里面!其实使用暴力组合式子也可以得到,但是谁会想往这角度推呢?

注意定义中是 nm 就猜 Yes 那么翻转的时候存在漏记,但是只有 y=x 向左的部分会漏记,补加上去即可,增量的计算方法和暴力做法相同

AGC018E

直观感受就是枚举中转点考虑前面后面方案乘起来,首先处理一个点向一个矩形走的方案数

形式化地讲,即 (0,0) 向矩形 (x1,y1),(x2,y2) 走的方案数

根据 (n+1m)=i=0m(ni) 的组合意义,将至推广至二维,先加上走到 (x2+1,y2+1) 的方案,那么需要减掉走到 (x1,y2+1)(x2+1,y1) 的方案

都到这了就不用什么组合意义了,直接拿原恒等式推就能得到少的部分是走到 (x1,y1) 的方案

对于在中间矩形中的点,路线必然进出第二矩形,即与第二个矩形的 下左 & 上右 边界相交,所以可以尝试枚举边界上的点对,但是这对复杂度并没有优化

尝试在拆 的时候最头疼的是变量相乘,但是本题里面的式子并没有这个问题,对于从 (sx,sy) 进,(ex,ey) 出的路线,能选点的个数是 (ey+ex)(sx+sy)+2,这个量可以分开计算

也就是说枚举第二个矩形 上&右 边界上的点,计算其向首尾两个矩形的路径方案,并乘横纵坐标加 2 的结果加入答案,并在答案中减去 下&左 边界上做相同计算得到的结果即可

注意处理第一个矩形时应当对应减一而第三个矩形应加一

AGC018C

时隔一年,我终于理解这种做法了,简记之

朴素费用流建图即建立三个种类点,连 (S,A/B/C,x/y/z,0),每个元素向 T(i,T,1,0),元素和种类之间的连边费用为权值,暴力最大费用最大流即可

优化即模拟费用流,直接类似于排序维护的做法需要很多的 堆 和 分类讨论,考虑一种快速找到增广路的做法:

对于还没去满的种类 S 向其连边,边权为 0;每个种类向 T 连边,边权为没有钦定种类的元素中该种类价值最大的元素,表示该直接选,不进行替换

种类之间连边,以 BA 为例,表示种类 A 中一个元素换成种类 BA 再另取,有向边的方向可以通过考察 EK 过程得到,边权是 maxxABxAx,正确性来源于 EK 保证了每个被选中的元素不会被退选同时增广路也不会重复经过点

找到边权可以使用堆进行维护,复杂度 Θ(nk2logn),建出的 Θ(k) 的图上面跑最长路作为增广结果加入答案,并根据增广路进行更新

需要改的是种类的剩余数量和种类之间的堆,根据 SA/B/C 的终点更新未选的元素对应的堆

ARC107F

尝试改变对绝对值求和的表达式,设 P=bi0bi,N=bi0bi 分别表示正负值的和,所以绝对值之和是 N+P2min(N,P)

由题设我们还需要减去没有被选择的点的 a,所以现在问题转化为最小化这两者的和,尝试使用网络流来解决这个问题,两者取 min 可以通过正数连 S 负数连 T 来表示

因为是在无向图上连边,所以拆点,再将无向图上的 (u,v) 表示为网络流图上的 (u,v,+),(v,u,+) 来表示连通性

题目展现出了最小割的端倪:割掉左侧/右侧的边就表示将其选入 N/P,如果一个连通块向源汇点的边不删完就还能走流量

那么最后在图上表示出删掉某个点:在 (u,u) 之间连接一条容量为 ai+|bi| 的边,注意删掉一个点之后它就不能在 N/P 中贡献了

这部分不再另外向 S/T 中连 + 边了?因为是最小化两部分的和,所以不另外连边就可以达到互相限制的效果

这图还是很精彩的,很有收获的一题 背过待用.jpg

AGC050C

观察操作形式,设 (a,b) 表示对手两侧(可以交换顺序)还剩下多少格子可以走,初始状态 (+,+)

玩家的操作是让对手的状态由 (a,b) 变成 (min(a,b),0)

那么你手上的操作多于 log 次那么一定可以让对方死掉,因为每次操作必然让最开始的 a+b 减少 12

那么设 dpi,j 表示操作完成了 [i,n],你还需要 j 操作才能让对方输(或者对方还有 2j 个格子能走) 的方案数

转移考虑如果这个操作可以不由对方执行,那么转移给 dpi2j1,j+1 因为对手需要走这么多步来达到当前的 dpi,j

而这里需要注意的是这个转移要满足前面 2j 个中没有玩家的必操作步

而如果这个操作可以由对手进行的话直接当作废步转移给 dpi1,j,因为有用的步都在上面转移了,对手剩余的回合最好选择呆在区间中点一动不动

ARC087F

考察这个限制:发现对于一条边而言,使其经过最多次数一定是让 (i,pi) 尽量处于边的两侧,贡献是 min(sizu,nsizu)

回到全局角度最大化该式子的和值就是找到重心,(i,pi) 分别处于重心的两个不同子树之中

然而直接统计排列很困难所以考虑减去不合法方案数,设 dpi 表示钦定 i 个位置的 pi 和自己是一个子树里面的

对于某个子树的 dpi=(sizi)2i!,这里前面是选择 ipi 的方案,后面因为这些 pi 可以乱放所以要乘阶乘

枚举重心的所有子树进行背包即可完成统计

每个 dpi 在完成钦定之后剩下的位置可以随便放 pi,要乘 (ni)!,最后附加上 (1)i 作为容斥系数即可


博主学了三四年OI并不理解基础容斥式子,下简记

考察有 k 个错误位置的排列在答案中的计算次数,它会在每个 dpi×(ni)! 中计算 (ki)

再不会容斥基础组合恒等式还是会的,所以就正确了

AGC052B

考虑该操作的本质:如果以 1 为根进行 DFS,将根到某点路径上的每个边的异或和作为该点的权值,那么对于和根不相连的点,操作一条边可以视作点权交换

ax 表示用 w1 作为边权的时候的点权,bx 表示用 w2 作边权的时候的点权

但是这样的思路明显有限制:和根相连的边在操作的时候并不能用点权交换的方法表示

那么建立一个虚根和 1 相连,如果能找到一个根和 1 连边的边权 W 满足 axW=byx,y 两两配对那么满足条件

由于 n 是奇数,将所有的上述对应式子异或起来之后发现 W=xori=1nxiyi

得到 W 之后判断是不是 {aiW}{bi} 相等即可

AGC004F

原来 CF1615F 的染色是常见套路

考察树的部分,将深度为偶数的点颜色取反,此时原操作变成交换相邻的 取反点 与 非取反点,最终的目的是将取反点点全放到 非取反点 处,非取反点 都到 取反点 处,此时再将深度为偶数的点取反就可以完成题设

剩下考虑每条边的经过次数,也就是子树里面黑点白点数量差的绝对值,设其为 ai,因为这些点需要从子树外运进来,形式化的就是 |ai|

判断 1 的条件是 aroot=0,让黑白点数相同

基环树的部分先建立 dfs 树,将图上的环变成根链,观察树上取反操作本质是二分图染色

先考察不能二分图染色的奇环基环树,此时操作反祖边可以 增加/减少 取反点数量,需要增加的取反点数量是 |aroot|2,这些点会对环上 ai 带来的影响就是链上 ai 均增加之,计算答案的方式不变

最后是可以二分图染色的偶环基环树,此时由于黑白点的数量固定,所以还是需要判断 aroot=0,上面的包判断 aroot0mod2 即可

计算出初始的子树 a 之后使用环上的边进行点的运输,将边上运输的点量设为 xi 并都使用返祖边对应的未知数表示,发现问题中所谓最小化 |xi| 就是找中位数,变化量就容易得到了!

posted @   没学完四大礼包不改名  阅读(217)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示