23.6 杂题

CF1152F Neko Rules the Catniverse#

small version 提示我们按值域来做。从小往大考虑插入每一个数,显然它可以插入在 ik 后面,0<km。由于 i 是最大的,所以还能插入在第一个数前面。那么可以考虑这样一个 dp:fi,j,k 代表考虑值域为 [1,i],总共插入了 j 个数,最后 m 个数的状态是 k 的方案数。转移是递推,所以可以矩阵乘法优化。复杂度 O(k38mlogn),空间非常小。

Gosha is hunting#

直接暴力 dp 是 O(n3) 的,看到是恰好,容易想到 wqs 二分。而这是一个费用流问题,所以显然对流量有凸性,两次二分,就可以把 dp 的后两维去掉了。

CF1239E Turtle*#

复杂度太神秘了啊。首先在确定了上下两层的可重集之后,显然一个递增,一个递减。然后记 wi=ai+1bi,有 ans=maxi=1n1base+jiwj。显然有 wi 递增,所以最大值只会在 1 (因为有可能是负数)或者 n 取到。

现在问题变成了划分成两个集合 max(a1,1+a2,i,a1,i+a2,n) 最小。不妨设最小的数是 a1,1,然后背包 a1,i。再记录一下第一行的个数,以及第二行第一个数。显然这是一个存在性背包,可以 bitset 优化。

CF613E Puzzle Lover#

先特判掉平凡情况,不妨设起点在终点左边。然后能分成三段:往左回来,中间绕来绕去,往右回来。从前往后 dp,设 fi,j,k,0/1 代表第 ij 列,匹配到 k,从左还是上/下来。显然可以 O(1) 转移。总复杂度 O(nk)

Nora's Toy Boxes*#


CF1837E Playoff Fixing#

其实非常水啊这题,显然可以建出一个 zkw 线段树的结构,对于每个节点,分成 (2i1,2i] 这若干段,每段内该出现的数的个数是确定的。如果现在对于这个节点的子树内的树已经确定了,然后你要分配给两个子节点,那么用组合数算一下就好了。

CF1832D Red-Blue Operations#

先二分答案,然后考虑这个恰好 k 步是什么玩意,由于这个恰好答案甚至可能比原数列还小。那么假设有 c 个比 mid 小的数,最后 c 步一定是操作在这些数上的。大胆猜测如果变蓝之后一定下一步变红最优,这样只会让值减少 1

分析了一通之后如何判断答案?如果 c>K 显然不行,否则如果 i[1,c],ai+ki+1<mid 也不行。如果此时 k=c 那么一定可以。否则思考多余的 k 都去哪里。如果 n=c 并且 kc 是奇数则肯定不行,因为这样最后甚至不是红色。c<n,如果此时 kc 是奇数,那么一定可以多操作在后面的部分,就一定可以。c<n1,这时后面多了两个,那么 kc 是偶数也行。最后统计每个数最多可以被操作多少次 1,只需判断 2× 其是否 kc 即可。

容易发现预处理后判断可以 O(1) 获得想要的所有值。此题的关键是要发现最后几步最大的操作是一定要加给一些值的。具次贪心,还可以得到一个 O(n) 的做法。

CF1826E Walk the Runway#

发现是一个 m 维 LIS,解决这种高维的问题好像除了暴力没有什么好做法。预处理出 fi,j 代表 j 能否放在 i 前面。这个可以从后往前扫,然后把后面的部分都删掉。暴力的做是 O(n2m) 的,发现这是一个 01 变量,用 bitset 存储可以做到 O(n2mw)。这也是高维偏序常见复杂度。

CF1826F Fading into Fog#

ABC304Ex Constrained Topological Sort*#

考虑从小到大贪心去填,这样子图的性质依据拓扑序就满足了,维护一个集合代表当前能选的数(即根据 L),显然是填在 R 尽量小的位置最优,于是拓扑排序去模拟这个过程即可。然后我们发现一个数的 R 并不一定有看起来那么大,比如说一条边 u,v,就必须有 Ru<Rv。同理一个数的 L 也没有看上去那么小。注意这个 R 的更新得是有序的(拓扑序逆序)。加上这个更新就能通过了。

ABC304G Max of Medians#

Gym104076C DFS Order 2#

直接 dp,需要求出这样一个辅助数组 fu,v,i,j 代表 u 的子树选择 j 个除了 v 子树以外的子树,总和为 j,无序组合的方案数。u,v 是树上一条边。这个东西是个背包,使用可撤销背包做到 O(n3)

Gym104076J Skills*#

先思考 n3 的 dp,根据套路设 fi,j,k,o 代表第 i 天选的是 o,且另外两个上一次选是 j,k。如果在某一天升级了某一个技能,但是在之后的某一天他变成 0 了,那还不如不升级。所以我们不需要考虑升级了某一个技能后又变成 0 的情况。

那容易发现如果选了一天,那么在 O(w) 天内一定会再选一次,于是状态就变成了 O(nw) 的了,注意代码常数。

CF1749F Distance to the Path*#

观察到 d 只有 20,记 fu,d 代表 u 子树内距离 d 的点的加法 tag。只用给 uv 的路径上每个点的 fu,d 加上 k 就不会算重。还有若干 lca 的祖先。暴力实现是 O((n+q)log2n+(n+qd)logn)。只有单点修改,所以可以树上差分,这样修改的复杂度更低。

CF1839D Ball Sorting#

显然是长度减去 LIS,那么枚举怎么分段,每一段也是这么贡献。且不同段之间也必须是 LIS。发现这个 N 非常小,于是 O(n3) 就好了,不知道有没有低于 O~(n2) 的做法。

CF1839E Decreasing Game#

考虑一局游戏,如果 i,j 是一次操作,连一条边。树是二分图,每次两部减去相同的值,最后都变成 0 了,所以两部和相等。此时是后手赢了,猜测如果存在这么一个二部图则后手一定胜利。否则后手不可能胜利。前者的构造是简单的,直接随便选取即可,因为保证了两部和一直相同所以是对的。


AGC002D Stamp Rally#

显然先二分答案,然后建出 kruscal 重构树,倍增找到合适的点,判断这个子树大小是否满足要求。

AGC002E Candy Piles*#

牛逼题。

AGC002F Leftmost Ball*#

这么傻逼的计数怎么没想出来/fn

显然这玩意等价于任意前缀白点数不小于其他颜色种类数。于是动态规划,fi,j 代表 i 个白点,j 种其他颜色的点的方案数。假设再多放一个白点,fi1,jfi,j。假设再多放一种其他颜色的点,枚举下一个空位放哪种颜色,把这种颜色所有点插入剩下的空位里。这样显然保证任意前缀白点数不小于其他颜色种类数。


CF571D Campus#

建出 kruskal 重构树,然后就是一段子树加贺子树赋值,对于每个询问求出最近一次归零的时间。那么就是一个二维矩形加,前缀查询。直接扫描线+线段树即可。

CF176E Archaeology#

典中典维护虚树,按 dfs 排序后的序列是 p1,p2,pm。则虚树是 (i=1mdis(pi,pi+1))/2,其中 pm+1=p1。仔细思考,一条边只会被下去和上来计算两次。用线段树维护这个东西即可做到单点修改(其实还可以区间反转)。

CF1628E Groceries in Meteor Town#

又是典中典,建出 kruscal 重构树,找出 x 和所有点的 lca 就可以了,而 lca 又是分治信息,直接线段树维护即可。

CF809E Surprise me!#

建议还是去看原题面,反正求的就是这个式子:

ijφ(aiaj)dis(i,j)

草草草推一推然后虚树上 dp 一下就好了。

CF1559D Mocha and Diana#

随便枚举一条边,如果他能连就连。随便找一个点,全部连到这个点上。还剩下一些能连的点,把这些点两两连边。

hdu6845*#

又忘了前缀线性基是啥了/tuu

二则问题,先假设全选 a,再调整一些 axorb。考虑从高位往低位填,找到这一位能抉择的最后一个人,将这一位变小(或者变大)。

那如何找这个人呢?使用前缀线性基,在插入线性基的时候记录一个 id,代表最后一个编号。对每个前缀都维护线性基,最后拿 r 位置的线性基即可。

ICPC2022西安区域赛A Bridge#

离散化,把关键点提出来,然后是一个动态树的结构,直接套用任意一种动态树算法即可。最好写的可能是阉割版 ETT(区间平移操作),或者弹飞绵羊式的分块。

CF650E Clockwork Bomb*#

看完题,一眼 LCT。觉得没有前途,想了很久,但是感觉思维被高级数据结构僵化了。打开题解区,发现一种不用高级数据结构的做法。

显然先缩点,然后断边连边。然而如果段的点两边有多个连通块不好维护。考虑经典剥叶子做法,从下往上依次把叶子连到他在第二棵树的对应节点上去。


CF1401F Reverse and Swap#

UR25A 设计草图#

UR25B#

UR25C#

POI2020 Komunikacja międzyplanetarn#

差不多得了,我再重新复述一遍做法。

尝试把答案化为两点在斜率为 tanθ 的直线上投影的积分。

02π(xixj)2+(yiyj)2|cosθ|dθ=02π|vivj|dθ=4(xixj)2+(yiyj)2

其中 vi=xicosθyisinθ。使用黎曼和近似估计即可。

POI2020 Les Bitérables#

标签线段树是一脸疑惑啊?感觉很难想到不是线性的做法。

不妨设 sisi1,一开始我们在 i1 的序列左边添加 si0,右边添加 sid。这样我们就可以把问题抽象成:选择 j 的位置全部跑到 0si1sij 个位置全部跑到 d,剩下的部分和 si 一一对应。

有一个显然的贪心是小配小,大配大,那么要求的就是一个带绝对值的和式。OIer 非常擅长分类讨论!所以直接拆绝对值。对于一个第 i 天的位置 j,假设一开始和它配对的位置 k 是比它小的,那么它对答案的贡献是正的。找到第一个比它大的位置 k,这时它的贡献会取一个反,并且以后都是负数。对于第 i1 天的位置 j,找到最后一个比它小的位置 k,显然随着滑动窗口的移动,和 j 匹配的位置只能比 k 小,这样 j 的正负性也不会变了。

所有这些位置修改都是 O(1) 的,由于两个序列都是有序的所以可以直接双指针。复杂度是 O(n+si)

LG9408 Locked#

直接 dp,把前后缀拼起来即可。注意空间,可以滚动数组。

LG9409 交朋友*#

如果告诉我这就是流可能就会做了。

建分层图,然后拆点刻画每个人只有一个玩具的限制。对于一条边 u,vu 的出点连向 v 下一层的入点即可。

LG9410 机场修建#

here

LG9411 Gtrimee*#

如果我没有理解错题解的话,就是高中数学。设 Fk(x) 代表答案的 OGF,有转移 Fk(x)=1+Fk1(x)Fk(x) 于是 Fk(x)=11Fk1(x)。定义分式变换 f(F(x))=aF(x)+cbF(x)+d。容易发现这是可以嵌套的。于是可以设 Fk=akF1+ckbkF2+dk。大力解出 a,b,c,d 即可。


HBCPC2023B Mode#

考虑预处理一些东西,长度为 L 的串,记 ai 为出现 i 次的有多少种。这个状态只有不到 2000 种。然后直接 dp,fL,S 代表还有长度为 L 的串没填,当前状态时 S 的权值和。求答案时枚举 LCP 即可。

LG6811 建筑大师#

之前做过

LG6860 象棋与马*#

思考什么样的 a,b 是合法的,一个显然的必要条件是 gcd(a,b)=1,amod2bmod2。猜想这个条件也是充分的,考虑归纳证明,a=1,b=0 显然成立。若 a>2b,可以 (0,0)(a,b)(0,2b),(b,a2b)(a,b) 等价于 (b,a2b)。否则容易得到 (b,2ba)。辗转相减后会得到 gcd1

剩下的就是一些莫反的基础技巧了。

hackerrank w26 Taste and Winning*#

fn 代表 2m1 个数里选 n 个数的方案数(也就是 (2m1n)),gn 代表选 n 个数不相同且异或和为 0 的方案数,答案是 fngn。根据异或的性质,如果前 i1 个数确定了,最后一个数只用等于之前的异或和即可。方案数是 fn1。可是不能等于 0 所以要减去 gn1。还不能和前面相同,枚举和前面一个位置相同,那剩下的部分异或和肯定是 0,那就是 gn2。于是最后的递推式为 gn=fn1gn1(n1)(2mn+1)gn2

CF1477D Nezzar and Hidden Permutations*#

做过的题完全不记得是怎么一回事呢?


Yet Another LCP Problem#

很多这种题都是转到后缀树上,然后建虚树瞎统计一下就好了。

CF1746F Kazaee*#

给每个数随机一个权值,判断权值和是 k 的倍数,那么错误概率约为 1k

CF213E Two Permutations#

枚举 x,然后这在值域上是连续的一段,所以取 b 的逆排列,然后就是一段滑动窗口。在滑的过程中,等价于还是维护原排列上几个数按顺序连成的数字串是不是等于 {a}+x,后者可以哈希 O(1) 得出,那么前者也可以维护哈希值。

CF1286E Fedya the Potter Strikes Back*#

相当于加入一个点后 border 的答案,考虑维护一个 border 的集合,并动态删除。由于最多加入一个大小为一的 border 所以均摊复杂度是对的。然后再用一个平衡树来维护所有 border 的值,全局对 wimin。使用“线段树合并”,可以均摊。

CF1622F Quadratic Set#

先把每个数都变成 2smooth 的,也就是把质因子偶数次幂都去掉。这时相当于选择若干个数,使得每个质因子出现次数均为偶数。给每个质数赋一个随机权值,相当于选择尽量多个数异或和为 0。答案不会超过 3,这可以分类讨论,然后枚举就好了。

CF1815E Bosco and Particle*#

牛逼题

Xenia and String Problem#

和 PKUSC2023D1T1 很像。这个结构很适合倍增,预处理每一段是不是,然后分类讨论即可。

CF1598G The Sum of Good Numbers#

不妨设 ab,显然 |a| 只有可能为 |m|,|m|1。后者要求 |b| 也为 |m|1。前者只需求出 lcp 就可以知道 |b|

判断两者和是否为第三者,可以用哈希。

CF906E Reverses#

找到回文串 border 部分

CF1393 Twilight and Ancient Scroll#

这题比较 edu,所以新开一个题解

CF1738H Palindrome Addicts#

问题基本等价于区间本质不同回文子串个数,但是我们不想写 10 级算法也不想写根号垃圾做法也不会 border 理论。找一些性质,比如不存在互相包含的区间,比如可以离线。考虑扫描线,新增和减少都最多一个本质不同串。从左往右加入字符,可以看作查询某个最长串上一次出现位置,而从右往左删去字符,不妨对反串也建立 pam。一次相当于链覆盖,单点查询。这个链还是根开始的,所以可以一个对数。

nb 的线性做法


AGC003E Sequential operations on Sequence#

注意到我们只关心最后是什么,考虑倒推,显然前面比它大的都没用,所以只用维护一个单调递减的序列即可。

然后变为对每一段求答案,而这这一段显然是若干段前一段加上最后一点取模的部分,二分出第一个小于的地方,这样取模后会减半,总复杂度 O(nlog2n)

AGC003F Fraction of Fractal*#

称在右边放一个相同的图形,跨越左右的的连通块个数为 a,上下为 b。黑色块数为 cnt。显然若 a=0,b=0,就是 cntk1a=1,b=1,答案就是 1。否则不妨设 a=1,b=0。记黑色左右相邻的个数为 c。有递推式:fk=cnt×fk1c×sk1,其中 sk 表示 k 级分型的左右相邻连通块数。s1=1。这东西也可以递推 sn=sn1×u,其中 u 是初始图形右边拼起来时相邻的块数。

AGC004E Salvage Robots*#

把机器人动变成出口动,出口往上等价于机器人往下,其他同理。记录出口最多往左往右往上往下分别 l,r,u,d 个格子。那这样有一些位置是一定选不到了,有一些位置,如果在过程中能选,是已经被选完了。fl,r,u,d 代表此时最大的答案,考虑扩展一维,可以发现可以被选的是一段区间,直接转移即可。细节较多。


CQOI2010 内部白点#

显然这个过程只会持续 1s,可以进行一个扫描线,每次找到该坐标中间的点,要求前面有一个黑点,后面也有一个黑点,修改的总和是 O(n) 的。总复杂度 O(nlogn)

CF1290E Cartesian Tree*#

不要把笛卡尔树当树!不要把笛卡尔树当树!不要把笛卡尔树当树!不要把笛卡尔树当树!不要把笛卡尔树当树!不要把笛卡尔树当树!

笛卡尔树的子树大小,其实就是只和他左边第一个比他大的位置,和右边第一个比他大的位置有关,设为 li,ri,其实大小就是 rili1。还是考虑扫描线从小到大加,其实在做的就是一个区间取 min,max。然后 li,ri 计算是线性的,可以直接拆开来算。这个做完区间取 min,max 之后还要做一个区间加。所以复杂度是 O(nlog2n) 的。

CF671C Ultimate Weirdness of an Array#

LG9247 集训队互测2018 完美的队列*#

这种 n 一般都比较傻吧,O(nlog2n) 看起来也不是很聪明的样子,只不过需要会一些复杂度精细分析。

更详细的题解


CF1432F Make It Ascending*#

答案不容易直接记录,考虑枚举答案。考虑一个贪心,从小到大确定最后数组内的数,那么只用记录当有 i 个数,用了 s 集合里的数时第 i 个数最小是多少,还有它在什么位置,转移的时候枚举一个集合,贪心的放在最前面的位置。复杂度 O(3nn2)

刷表比填表快很多!

CF1392H ZS Shuffles Cards#

之前写过

CF16116H Keep XOR Low*#

和 abc304g 无差吧。

CF1503E 2-Coloring#

先把可能的答案画出来,然后发现是一个格路计数。

CF1608F MEX Counting*#

怎么把条件记到状态里去?fi,j 代表前 i 个数的 MEX 是 j,显然 jO(k) 的。但是这样无法转移,我们需要知道哪些比 j 大的数被占了。那么就还需要记录一个 k 代表 k 个位置选择了比 j 大的数。但是有可能有重复,所以改一下变成 k 种数。转移的瓶颈在 fi,j,k×(klj1)(lj1)!fi,l,k(lj1),系数只和 j 有关,所以可以前缀和优化。注意到这是一个斜着的前缀和,但是不影响。

CF1621G Weighted Increasing Subsequences*#

y=maxyx,ay>ax,包含 x 的 LIS 减去以 x 开头以 y 结尾的。任意求 x,y 显然是不行的,考虑找一些性质。首先 ax 的范围可知,是 [maxz>yaz,ay),然后你发现对于不同 y 这些区间的长度和是 O(n) 的。暴力枚举就是 O(nlogn)

CF1810G The Maximum Prefix*#

前缀最大值在后面添加不好维护,考虑在前面添加,这样不需要记录前缀和。朴素的实现是 O(n3) 的,容易写成格路计数模型,交换起点终点,可以做到 O(n2)

CF1750G Doping*#

钦定 k

CF1696H Maximum Product?*#

CF1809G Prediction#

等价于说是任意一个前缀,除了最后一个数之外的最大值和最后一个数之差大于 k。有可能赢的部分是一个前缀最大值,从后往前 dp 这些部分。容易写出一个 O(n2) 的做法,根据 1608F 的套路容易优化成 O(n)

CF477D Google Code Jam*#

题解

Ynoi2018 五彩斑斓的世界#

题解


CF294C Shaass and Lights#

枚举每一段最后一个删的是啥。

CF1753C Wish I Knew How to Sort#

显然是要算一个概率取倒数的过程,考虑什么样的操作是有用的。先排序,然后在 0 段里面的 1 和后面的 0 的交换时有用的,算这个的概率即可。

CF1657E Star MST#

枚举每个值域是哪一段。

CF660E Different Subsets For All Tuples#

钦定子序列是第一次出现。

CF785D Anton and School#

钦定最后一个右括号,然后范德蒙德卷积。

CF1540B Tree Array#

考虑求 i<jji 前面的概率。显然只与 ij 的路径相关,考虑预处理一个 dp 数组 fx,y 代表距离 lca 分别位 x,y 的概率。转移显然 fx,y=12(fx,y1+fx1,y)

CF1716F Bags with Balls#

大力推式子即可。

i=0n(ni)aibniik=j=0k{kj}j!(nj)aj(a+b)nj

CF1657F Words on Tree#

经典 2sat,求出每个位置是哪两种,然后每个限制是哪个,建边即可。

CF1437F Emotional Fishermen#

和 CF1809G 一模一样。

CF1626F A Random Code Problem*#

由于我想出题,所以此题做法暂不公开。


CF1097D Makoto and a Blackboard#

注意到转移是一个迪利克雷卷积然后再一个点乘上约束个数函数的倒数。所以这是一个积性函数,只处理质数幂的情况即可。

CF916D Jamie and To-do List#

写代码题,一个好些做法是写一个结构体可持久化值域线段树和名字。

CF506D Mr. Kitayuta's Colorful Graph#

直接根号分治,复杂度多一个 log 也能冲。

CF1810F M-tree*#

判断答案是否 xai+depix,也就是 depixai。肯定是令 depi=xai 这个界比较松。令总量为 1,每有个一个 depi 层的叶子,就减去 1mdepi。现在就等价于 1mxai1miamx。动态维护 m 进制数即可,使用线段树是一种比较好写的做法。具体来讲,维护一个区间的 min,max,查询一段 0 或者 m1 可以线段树上二分。

CF1411G No Game No Life#

先求出每个点的 sg 函数,我也不知道这为什么是一个 multi sg。不过注意到这是一个图,你要求 mex 肯定不会太大,毛咕咕一下不会超过 m


CF576E Painting Edges#

posted @   Semsue  阅读(116)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
Title
点击右上角即可分享
微信分享提示
主题色彩