做题记录 4.0

Merging Towers

来源:CF1380E, 2300

仔细推一推性质,发现最优策略就是从小到大将 i 移到 i+1 上.

然后可以把连续段缩成一个连通块,那么连通块个数减一就是答案了. 

所以这个问题就转化成每次合并两个 vector, 同时要求合并连通块. 

这里用 set 维护的连通块,然后进行的启发式合并,复杂度为 O(nlog2n).  

  

Xenon's Attack on the Gangs

来源:CF1292C, 2300 

仔细分析发现 mex 有意义的话必须要包含零边.  

然后一定是 0K 连续分布在一跳链上.   

在这条链上,分布情况就是以 0 为中心,从小到大向两边扩展.  

那么满足这个性质就可以进行 DP 了.  

f[x][y] 表示端点分别为 x,y 的情况然后每次考虑新加入边的贡献即可. 

  

Boxes And Balls

来源:CF884D, 2300 

理论最优是 3 个合并,但是偶数的情况会剩下两个.  

那么就特判,如果是偶数就提前合并最小的两个,然后再三个一起合并. 

  

Removing Leaves

来源:CF1385F, 2300 

显然只要有 k 个叶子就要尽量删除,那么用堆贪心维护叶子最多的即可. 

模拟的时候要精细一点,对于每个点开一个叶子 set 和总相邻节点的 set.  

要及时删除和更新. 

  

Pattern Matching

来源:CF1476E, 2300  

首先,模式串是互不相同的且匹配串最多可以与 16 个模式串所配对.  

那么就可以暴力连边进行拓扑排序,然后按照拓扑序输出结果即可.    

这里偷懒,直接用的 string+map, 常数可能会大一些. 

  

Prefix Product Sequence

来源:CF487C, 2300 

大于 4 的合数不合法,只需考虑质数的情况.  

理想的构造方式是 ii1, 这样的话在模意义下正好是一个排列. 

验证发现不会出现数字相同的情况,直接输出即可. 

  

Pig and Palindromes

来源:CF570E, 2300  

这道题的话最直观是列状态 f[x1][y1][x2][y2] 但是多了一个 n

但是我们发现如果知道步数的话通过横坐标可以求得纵坐标,这样就能降低复杂度了.  

由于空间消耗很大,所以要用到滚动数组.  

  

Scalar Queries

来源:CF1167F, 2300 

可以对每个数字拆开考虑贡献,然后一个数字的贡献就是在每个区间中的排名.  

根据常见的套路,这个可以转化成多少个小于等于这个数字的个数.  

然后就可以依次计算该位置左面的贡献和右面的贡献以及本身的贡献.  

用树状数组统计答案即可. 

  

Beautiful Pairs of Numbers

来源:CF403D, 2300   

这道题的话可以看做先用 k 段凑成一个长度为 l 的段,然后其余插空. 

插空的话就是隔板法,然后前面就是一个二维 DP, 提前预处理即可. 

  

Daniel and Spring Cleaning

来源:CF1245F, 2300 

这道题可以转化成有多少个 ab 为 0.  

然后这个东西可以拆分成若干个前缀和的形式,省去了下界.   

在进行数位 DP 的时候,同时进行 x,y 两维,枚举当前选什么.  

最后记忆化搜索即可.  

  

Double Profiles

来源:CF154C, 2300  

可以把每个点所连的点哈希起来,然后放到 map 里面判断. 

特别地,对于相连点就挨个枚举,然后刨掉相邻点看哈希值是否相等即可. 

  

Anton and School - 2

来源:CF785D, 2300  

这道题正常做是 O(n2) 的,然后注意到可以用范德蒙德恒等式来做.  

这里注意组合数有 C(n,i)=C(n,ni) 这个性质,如果下标之和并不是定值可以考虑翻转一下.  

  

Devu and Flowers

来源:CF451E, 2300 

如果没有数量限制就是经典的组合问题,有数量限制就考虑容斥一下.  

不合法的情况就是强制几个选 f[i]+1 个,然后剩余的随便选.  

  

Enchanted Artifact

来源:CF1282D, 2300 

交互题. 

不妨第一次询问一个 a 来确定长度.  

之后可以询问 aaaaabaaaaa 这种 1 个 b 的串来确定第 i 位的字母.  

然后在开头特判一下是否是全 b 的序列即可. 

  

Hemose in ICPC ?

来源:CF1592D, 2300  

肯定要和某种二分结合,每次肯定是要放进去一个连续的点集.  

如果对欧拉序了解的话可知道欧拉序中相邻两点就代表着一跳树边,所以用欧拉序二分即可. 

  

Drazil and Park

来源:CF515E, 2300     

可以分成两种情况:顺时针走和逆时针走. 

对于顺时针走的情况是一个 x[i]+y[j] 的情况,这个可以用线段树来维护

对于逆时针的情况直接查询前缀最大值即可. 

  

Mike and Foam

来源:CF547C, 2300 

考虑每次加入一个数的时候算多少个与其不互质的,然后容斥一下.  

算不互质的就是一个容斥,容斥系数其实就是莫比乌斯函数,这里就直接爆搜了.  

由于一个数字本质不同的质数最多就 7 个,所以时间复杂度完全够用. 

  

Edges in MST

来源:CF160D, 2300  

先随便拿出一个最小生成树出来. 

显然,对于非树边,可以看是否能替换树边分为 2, 3 两类.  

对于每一个树边,如果存在非树边可以替换该树边,则为 2, 否则为 1.  

用树上差分加线段树合并可以方便地解决该问题. 

  

Yet Another Segments Subset

来源:CF1399F, 2300 

区间 DP,难点在于求 c[i], 即第 i 条线段最多包含多少条其他线段.  

然后求这个的话可以把所有线段按照长度从小到大排序,然后每次 O(n) 拿出 i 内的线段进行一遍 DP.  

由于内部的线段长度更小,所以 c[j] 是可以直接拿来用的.  

  

Isomorphic Strings

来源:CF985F, 2300  

这道题强调字母之间的相对位置,不妨对每种字母开一个哈希表,然后判断一下即可.  

为了防止出题人卡哈希,这里用了两个 base 和两个模数.  

  

Envy

来源:CF891C, 2300 

对于一个图来说,最小生成树所构成的边的种类数是固定的. 

就是说,对于边权为 v 的边在一个树中有 c 个,则任意必有 c 个. 

然后对于一个生成树中同一权值的边,连通性也同样是必须相同的.  

那么在这道题中就可以对于询问离线,每次讲 [1,i1] 的边连出来,然后看 i 的询问边是否有环即可.  

由于需要连边并撤销,所以直接上可撤销并查集即可.

p.s. 这道题用 LCT 做也是经典问题,即每次暴力查看一条边是否能加入,能加入则加,不能加则不合法. 

  

Centroids

来源:CF708C, 2300  

对于重心来说,显然合法,然后非重心来说要从最大的子树选择最大的且不超过 n/2 的子块删下来.  

求最大的 n/2 的子块用换根 DP 求解即可,这里开了一个前缀/后缀的最大值数组,会方便很多. 

  

Count Pairs

来源:CF1188B, 2300 

在等式两侧分别乘上一个差,左边就能凑成平方差的形式. 

然后最后可以把和 i,j 相关的分别移到两侧,用 map 来统计即可. 

  

A Simple Task

来源:CF558E, 2300 

对于每一个字母的位置开一个线段树,然后排序的话就是两个区间赋值操作.  

全程都用线段树维护,由于空间十分充裕所以该做法是正确的. 

  

Another Filling the Grid

来源:CF1228E, 2300  

二项式反演:只要满足钦定的情况把恰好的情况算了组合数次就可以使用.  

这道题中钦定几行/几列不选,然后用二项式反演计算恰好的情况即可.  

  

Road Improvement

来源:CF543D, 2300  

这道题是一个换根 DP, 但是无法求逆元.  

当逆元不存在的情况,这种问题的套路就是用前缀/后缀积来替代逆元.  

那么这道题中只需对每个点的所有儿子维护一个前后缀的积,然后转移即可. 

  

Pairwise Modulo

来源:CF1553F, 2300 

把式子拆开化成两个部分,然后前半部分可以调和级数在乘上 O(logn) 处理.  

后一半部分的话是 a[k+1]/a[i]=t 这种形式,不妨考虑每一个 a[i] 对于后面的贡献:

即枚举那个 t, 然后给 a[i]×t 加上 a[i] 的贡献即可.  

  

Array GCD

来源:CF623B, 2300  

有一个非常关键的信息:因为删除的是连续段,所以 a[1]a[n] 并不可能都删除掉.  

那么就可以枚举每一种可能的质因子然后进行 DP 了,设计 DP 状态为 f[0][x],f[1][x],f[2][x].  

分别表示没有删除,正在删除,删除完毕三个状态,然后转移即可.  

  

Optimal Insertion

来源:CF1601C, 2300  

考虑 b 序列只有 1 个数字怎么做:直接贪心塞到 a 中的最佳位置.  

然后有多个数字时答案的下界就是把每个数字都塞到各自的最优位置.  

但问题是我们无法预知 b 中内部的数字会产生多少逆序对.  

但是我们发现随着数字递增,最佳位置不可能递减,所以把每个数字独立开来各自求最佳位置即可.  

  

Company

来源:CF1062E, 2300 

显然对于一堆点的 lca 来说只需看 dfs 序最小和最大的 lca 就行. 

那么删除的时候也肯定删除最小/最大的点,然后就写两个 ST 表和倍增求 lca 即可.  

  

Pursuit For Artifacts

来源:CF652E, 2300  

降智题.  

开始一直在想 DFS 树和返祖边那一套理论,然后就想不出来了.  

但是直接按照点双的思路思考的话就简单了:因为不能重复经过边,所以显然可以点双缩点.  

那么一个点双内存在 1 边就把这个团标为 1,然后点双之间的边就正常连.  

最后只需要看点双树上 a,b 两点之间是否有 1 边/ 1 点即可.  

  

Product Oriented Recurrence

来源:CF1182E, 2300 

直接考虑递推式时是 f(y)+b 的形式,然后 b 不好处理. 

但是好在 b 是关于 i 线性的,所以在进行矩阵乘法的时候把后面的常数一起维护即可. 

  

Dogeforces

来源:CF1494D, 2300  

写了一个分治算法.  

对于一个叶子节点来说,可以知道这个叶子节点到根的路径.  

然后对于其他的叶子节点,可以知道与选定叶子节点 lca 处的值.  

那么就根据 lca 处的值对叶子节点分类,然后进行分治即可.  

有一些细节需要注意一下. 

  

Shovels Shop

来源:CF1154F, 2100  

肯定会买最便宜的 K 个,那么直接令 f[x] 表示购买 x 个的花费. 

然后 O(k2) 转移即可. 

  

Increase Sequence

来源:CF466D, 2100  

一道差分题.   

a[i]=ha[i] 即与 h 相差多少,然后我们想通过对这个序列 1 使之变成全 0.  

然后这种问题就可以用差分数组来解决了,即每次可以将一个位置 +1, 一个位置 -1 且次数仅为 1 次.   

然后每次 +1 就是一个与前面 1 的匹配问题,求解即可. 

  

Pencils and Boxes

来源:CF985E, 2100 

把所有数字从小到大排序,那么每次一定是连续的一段放到一起.  

这样的话就可以从左到右进行 DP 了,每次枚举最靠右选几个. 

然后这个可选择的数量也是一段区间,直接用前缀数组判断这个区间内有无合法状态即可. 

  

Anton and Tree

来源:CF734E, 2100   

把颜色相同的连通块缩点,然后考虑如何进行染色.     

对于一跳链来说,答案就是从链的中间开始染色,每次会向两侧拓展一次.  

树的情况答案肯定不会小于链的情况,也肯定不会小于直径的情况.  

直接从直径的中心开始拓展即可取到答案的下界,所以在缩点的树上求一个树的直径即可. 

  

OpenStreetMap

来源:CF1195E, 2100  

二维 RMQ 来做,不妨先对每一个列求一次,然后放到一个二维数组里.

最后再对行求一遍 RMQ 即可.  

  

Mishka and Interesting sum

来源:CF703D, 2100  

区间异或和就是出现次数奇数次的数的异或和.  

那么偶数次就是所有不同的数异或上奇数次,求不同的数字就用离线树状数组即可.

  

Duff in the Army

来源:CF587C, 2200  

直接上树链剖分维护每个区间内前 10 小的编号即可. 

  

Magic Gems

来源:CF1117D, 2100 

直接做用组合数不太能做,不妨考虑递推.  

f[i] 表示凑满 i 个的方案数,然后考虑最后一个如何选择. 

1. 最后一个只贡献 1

2. 最后一个贡献 m 

然后这个递推就可以用矩阵乘法来做了. 

  

Array Partition

来源:CF1454F, 2100  

可以枚举前缀,然后合法的后缀是一段区间,然后二分找到最小值等于前缀的中间段即可.   

  

posted @   guangheli  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示