【笔记】杂题选讲 2023.12.12

笔记 2023.12.12:杂题选讲

ARC132E

首先发现最终状态形如:中间两个洞夹着的没人动过,它的左边全是 <,右边全是 >,考律左边全是 < 的方案数。然后若给每个洞被选时间标号,则定向方案数是 2n后缀最大值。考虑从后往前 dp,将这个系数直接记在 dp 值里,然后就能算了,考虑每次插进去一个数插在哪里。fi=fi1×2(i1)+fi1

CF1610H

无解显见。将链分类为直链(有祖先关系)和弯链,显见选一个根节点可以解决所有弯链。如果树本身是一条链,那么是经典贪心问题。类似的,对于一个合法方案,我们可以尝试将选的点向上跳,在不影响自己子树的情况下不劣。考虑 dp,fu 表示考虑所有在子树内的关键点对应了链,关键点定义为链深度较浅的向下跳。fu 至少是所有儿子的和,考虑关键点,如果有两个子树有 dp 值,那么全部合法,否则向有 dp 值的地方尝试跳,直到跳到某条链链底,事实上因为讨论过多,不妨认为直接就是 fu=max(x,y)是直链,fau=x(fy+1)

对于最终答案,为了判断根节点选不选,不妨将 f1max(x,y)是弯链{fx+fy+1} 取最大值,这是考虑 (x,y) 上面到底有没有选到点,如果最终方案上面取到一个点,那么这个 max 取不到。

CF704C

将限制的两个变量连边,因为度不超过二,所以就强行 dp。

这东西很烦的,应该能做的。

CF1253F

以充电中心为端点,建一张完全图,边权是两个充电中心的原图最短路,要求这张完全图上的路径最大值最小。一眼最小瓶颈生成树,重构树一下,问题变成求最小生成树。

其实是假的。

考虑树。考虑按照树上路径走,每走一步都试试充电。disx,表示离 x 最近的充电站到 x 的距离,显然可以魔改 dijkstra。然后发现每一步能充电就必然想要充电,我们可以写一个限制形如:

cdisxwdisy

表示我走完 xy 后必须想要充电。如果这一次没充上,下一步其实放宽限制,甚至可能寄了,所以声称路径上所有边满足这个限制是必要条件。

那么对于图就求 Kruskal 重构树。

CF1446D2

注意到全局众数 a 一定出现,否则扩张区间。枚举另一个众数是 x,不妨钦定 x,a 就是区间众数(否则扩张),那么我们只需要要一个区间使得 a,x 的出现次数相等,一眼将 a 设为 1x 设为 1,找和为 0 的连续段。进一步的发现有一些 a 是没有必要每次都拉出来的,例如 aaaaaaaaaaaaaaaaaaxxxaaxaaaaaaaaaaaa 就只需要中间 x 左右两边的 a。进一步的我们就是只关心那些 x 向左向右一旦他只剩下一堆 a 就不要继续向下,这样复杂度就均摊掉了。

一些想法是我们只需要找到每个 x 向左向右到达的第一个使得 cnt[a]=cnt[x] 的地方,拉出所有 a,x 然后再做。枚举后继的部分记两个指针表示 a,x 分别行进到哪里,用一些指针和双端队列拿出所有数字,然后归并排序,然后前缀和部分直接开桶。至于具体实现我也不知道。

CF1718D

笛卡尔树同构。根据已知信息推断每个未知数的合法区间,满足合法区间后,如果有不合法的直接 swap 一下。

然后做点和区间的匹配,正着贪心失配的区间和反着贪心失配的区间(注意是区间匹配点,按照左端点排序完了以后选个最靠左的)的并,声称是合法的 d 的范围。

CF1603E

完美,等价于排序后每个前缀合法。

枚举最小值,记录填了几个数,目前到谁,总和,然后转移枚举填几个数字进去,是 O(n6)

an=n 时,因为 a1nai0(aia1)0,由此整个序列都是 n

an=n+1 时,因为 a1(n+1)aia1(aia1),记录右边那个东西以判断,这样记下的总和是 O(n) 的,而且不仅是这个序列,每个前缀都适用。

现在 O(n5)

观察到枚举 a1 之后每个数字填进去的个数,由于总和限制,是调和级数。

O(n4logn)

a1akikaiakikai/a1akk

结论是 a1+nn,因为考虑就是拿 y=a1y=x 切,切到后面那一段,因为刚刚说了 aii,所以后面那一段,考虑 (aia1)=O(n),后面一段的长度为 O(n)

O(n3nlogn)

CF1208H

直接抄题解了,不想再写一遍过程了

ARC154E

先拆掉,考虑单独一个人的贡献。

i<j,p[i]>p[j](ji)=jji<j[p[i]>p[j]]iii<j[p[i]>p[j]]=ii(j<i[pi>pj]i<j[pi<pj])=ii(ij<i[pi<pj]i<j[pi<pj])=ii(ij[pi<pj])=ii(ipi)=ii2iipi

注意这里换一下对象,我们求每个数字 pi 最终去到的地方的期望 E[final_pos[pi]]=s[i],然后求 (n+12)m(ii2isipi)


考虑对于下标 i,经过一次包含它的翻转到达 j,的方案数为 min(i,ni+1,j,nj+1)。观察到这意味着 ijinj+1 的概率一样。于是无论具体到哪里的期望是多少,只要干了这个事,期望到达 (n+1)/2 的位置。

没有干成这个事的概率是 P=(1i(ni+1)/(n+12))m

从而 si=Pi+(1P)(n+1)/2

*ARC135D

整个矩阵经过显然的手法可以将 a[1...n1][1...m1] 全部置零,求出来大概是什么交替和需要是常量,然后操作不影响交替和。就我是说每一行 a[i][1]a[i][2]+a[i][3]a[i][4] 是常数,每一列也如此。然后乘 (1)i+j 变成和不变。

然后考虑怎么构造一个新的矩阵使得它的和限制不变,这样就一定能变换过去,由刚才的置零。

不妨记 Ai=jai,j,Bj=iai,j

P8528

首先这个子区间就扫描线,历史版本和。我们肯定是想数不合法区间的个数。

考虑 (x,y),如果 lca(x,y) 在两边,就会有一个限制。

考虑支配对的形式,大概就是说 dsu on tree 的过程中,以 z 为根加入轻子树时,x 去找 y ,去找最接近的 y 才能限制到更多的区间,于是找前驱后继。

这样有用的支配对只有 O(nlogn) 个。

CF1540D

这不是我们逆康托展开吗,但是有一种新的求 pi 值方法就是说令 x=bi,然后 i 向后枚举,如果 xbj 那么 x 自增,否则不变,最后输出 nxx 维护了目前已知比 pi 大的数字的个数。

考虑对这东西分块,有很多后缀加和二分可以做到 O(nnlogn)。就是维护 x 进去出去什么东西。然后改成线段树好像能做,然后对询问分块处理好像能严格根号,感觉很烦。

CF468C

对于 x<9×1018,都有 f(1018+x)=f(x)+1

考虑构造,初始区间是 [0,1018),然后每次将区间右移,变成 [1,1018],这样就等于 f([0,1018))+1,每次就加一了,因为 a1018,所以加的次数不超过 1018 次,结论保持。

posted @   caijianhong  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示