2023.10 做题纪要 #1
2023.9.29
放假了哈哈。
然后下午去姥姥家,然后晚上看了一晚上视频,没干啥有意义事情。
2023.9.30
去姥姥家,和我表哥成功会面,然后打了会奥日,打到救猫头鹰了,看奥日和猫头鹰贴贴完了之后猫头鹰就寄了。恼了。我哥他同学亲切的送来了一份 榴 莲 蛋 糕,然后吃完了,感觉确实不太喜欢榴莲。
然后晚上回去和某只兔子(悠悠)玩了会密室逃脱模拟器,两个人网都巨卡,然后就放弃了,我就去打 CF 了。
然后成功以 1 分优势战胜了小粉兔()
SoyTony:你比小粉兔高一分,小粉兔 51 名,那你就 50 名进集训队了
2023.10.1
上午睡觉。
然后开学了,哈哈,非常开心。
下午啥都没干,看了一道题然后也没写出来。然后写了个 To-do list,希望 10 月能做完吧。
由于高一高二都没开学,我们只能去西扩食堂吃饭,西扩食堂好高级。
有人说我把链接放假期内容里面看不到,那我放外面了。10 月 To-do list
2023.10.2
喜报:我起床了。
今天是 hzoi 参加的第一场 accoders 联测,希望同学们下分愉快。
CF526G Spiders Evil Plan
还挺有趣的题,但是我菜啊!昨天下午看了一下午不会做。(甚至一开始还看错题想了半天)
首先考虑这样一件事情:显然我们选的路径的端点都是叶子。如果我们选出了
那么我们现在可以只考虑选
问题在于,以每一个点为根做复杂度太高了,不能接受。发现,我们选的最长的路径一定是到直径的某一个端点,那么也就是说直径的一个端点一定存在于最后的连通块中。那么我们以这两个端点为根做一遍上面的做法即可。注意到端点一定是叶子,所以问题变成了选
但是意识到这样的方案不一定包括
P3642 [APIO2016] 烟火表演
咕了太长时间了,slope trick 基础练习题。
首先容易写出一个 DP,设
绝对值加
首先考虑每个儿子的操作,每次将这个东西加一个绝对值函数再取
(设
简单分类讨论即可得出,不再赘述。
然后把这个图像画出来,发现这个操作实际上是将这个凸函数的左半部分上移
考虑怎么用 slope trick 维护。首先发现右半部分的点永远不超过
然后考虑合并,由于右边的点均只有一个,我们考虑先合并左边再依次插入右边,合并直接可并堆或者启发式合并即可,插入右边时分类讨论一下插入的点在平坡还是在左边,如果在平坡就更新平坡右端点,如果在左边那么就是将斜率
P9623 [ICPC2020 Nanjing R] Baby's First Suffix Array Problem
当时 yspm 给 SoyTony 推的,我在看 whk,然后就看了下这题,推完第一部分以为第二部分就类似做法就完了,然后后来回来看发现第二部分没法这么做)不过做法差的也不是特别大。
考虑先用整个后缀的排名来表示这个子串的排名,然后再考虑删除一个后缀后排名的变化。这样初始值就是区间内有多少点
然后考虑什么情况下删除一个后缀后大小关系会发生改变。设
那么我们现在把问题分成两部分:求有多少原来
第一部分相当于要求满足下面条件的
考虑到
然后这就是一个很直接的二维数点问题了,直接做即可。
第二部分相当于要求满足下面条件的
这个条件就没有很好的单调性了,没有很简单的做法。同样注意到
具体的,我们对
(
即:
发现这就是一个二维数点的形式了,那么我们直接树状数组维护就能跑了,这样套上一个分治,复杂度就是
2023.10.3
这里应该写一点简要的日记的,但是今天好像也没干啥事,所以摆了。
P9057 [Ynoi2004] rpfrdtzls
考虑一个比较神秘的扫描线转化:将询问与修改差分,然后对位置跑扫描线,以操作时间为下标动态维护整个序列。
这样,所有的查询操作就是在序列上的一个单点查询。
修改操作有:插入一个数,删除一个数。
正常维护一个
可以发现,若插入删除一个数,仅有
我们要维护
实际上由于
考虑 x11[x111x11x11]11x
即,除了最后一段外,每一段连续
最后一段的
我们令
删除
加入
上述操作均只会改变
每次暴力修改应该是两个
这样查询的时候大概就是
复杂度
P8511 [Ynoi Easy Round 2021] TEST_68
easy ynoi.
考虑找出全局异或和最大的一对点,除了这两个点到根的路径上的点外的答案就都等于这对点的异或和。剩下的只有两条到根的链上的路径的答案,而发现这样的点包含的点集是存在包含关系的,于是直接暴力加数计算即可。
AGC018D Tree and Hamilton Path
考虑哈密顿路径就是哈密顿回路减一条边,那么我们先考虑构造一个最长的哈密顿回路。
首先这有一个显然的上界
然后考虑构造最长的哈密顿路径,删肯定删一条最小的边,那么直接找重心相连的最短的边,如果有两个重心那就选两个重心之间的边即可。贪心策略感性理解,具体证明我不会,咕了哈哈。
P6108 [Ynoi2009] rprsvq
怎么 Ynoi 还有数学题。
考虑方差等于平方期望减期望平方,考虑每个数对答案的贡献,简单推一下发现最后的答案一定是
具体来讲,要求三个系数:
简单初等推导:
于是就做完了。
2023.10.4
本来打算打个模拟赛的,然后看完题之后发现 T1 T2 T3 傻逼题,T4 还是两天前刚做过的题。怎么每次我想打模拟赛的时候就正好碰上【数据删除】。
一句话题解T1 二合一,分块板子加莫队板子,应该还卡常。
T2 显然的
T3 数学选修二练习题。求导,化简,三角恒等变换,然后解个二次方程就完了。
T4 就是这个博的第一道题。
“摆渡”“摆渡”,一摆一渡,摆的是自己,渡的是别人,渡人即渡己,故摆能渡天下人。xx 本来想进省队,但是每天开摆睡觉,最后为他人让出了一个省队的位置,同时自己的身体也变得更加健康。
所以我要摆了!!!
被 jjdw 折磨了三天,上午把【数据删除】研究完了,有可能得出了一个比较诡异的东西,不知道是不是重复发现。所以先不发了,jjdw 好像要拿来投公开赛。
好像一天一道题都没写,把自己砸了。
2023.10.5
好想,但却只能,哎。
早上看了眼 wsc 的游记,羡慕初中生了羡慕初中生了羡慕初中生了。我怎么已经高二了啊,大火鱼。两年前高二看我是不是也这种感觉啊。
但是还得学 whk,不然学考过不去,大火鱼。
不过不知道这几句话有什么联系就是了。
才发现距离 CSP-S 就只有两周了。
牙套刮到舌头了,疼炸了,呃呃。
CF1767F Two Subtrees
昨天看了半天没写的题,摆了半天。
首先有一个超级大弱智
但是你把问题直接拍到 dfn 序列上去做是会丢失很多信息的(所有人的题解中都不约而同的出现了这一句话,感觉非常有趣),所以你考虑还是在原树上去做。考虑如果你只维护一个子树的众数怎么做?发现是可以跑 dsu on tree 的(虽然线段树合并也能做,但是没啥可拓展性),而 dsu on tree 的过程仅涉及加点与删点。发现这个过程本身就非常可以莫队了。那么考虑维护出来 dsu on tree 的操作序列,这样每个子树就是这个操作序列的一个前缀,这样子树变成了一个一维的信息,直接莫队即可,复杂度
你这左右两个端点都用 dsu on tree 太劣了啊,能不能再利用下树,把一边的
如果询问两个子树都大于
P7212 [JOISC2020] ジョイッターで友だちをつくろう
火大,怎么永远想不到启发式合并,bitset 害人不浅。
首先分析题目给的性质,发现如果两个人互关了,那么由双向边连成的连通块会变成一个完全图,而如果一个人关注了一个团中的一个人,那么这个人就会关注这个团中的所有人。
那么考虑并查集维护每个极大团,对每个团维护其所有人,入边,出边的集合,统计答案时用入边数乘人数再加上每个团内的边就是答案。入边我们记录具体到人,出边只记录连到的团的编号。
考虑每次加边会发生什么,首先如果这条边是一个团内的那么直接忽略,否则就是从一个团向另一个团加边。如果原来
那么我们使用启发式合并维护这几个集合,在合并的时候容易判断是否存在这样的
我以为出入边的数量不确定不可以直接遍历,只能整些根号分治一类的算法,没意识到可以把这三个集合放在一起启发式合并就能直接遍历了,恼了。
P8528 [Ynoi2003] 铃原露露
考虑计算不满足条件的的点对,这样只需要将每个条件表示的矩形并起来就是答案。
对于一个点对
那么考虑所有
然后问题变成了,给定若干个矩形,查询矩形内这些矩形的并的面积。扫描线,维护最小值与最小值出现次数,然后上个历史求和即可。时间复杂度
also available in 3.9 听课记录。
AGC019C Fountain Walk
额。
首先发现显然经过一个喷泉距离会更短,那么肯定是经过尽可能多的喷泉,那么这相当于求一个 LIS。
观察样例三发现可能会出现必须横着经过某一个喷泉的情况,由于一行一列只有一个喷泉,所以仅有可能是因为上述过程中每一行或者每一列都有喷泉,导致最后卡到一行上必须横着经过一个喷泉,那么特判一下即可。
AGC018E Sightseeing Plan
to-do list 里一堆之前想做但是咕掉了题,呃呃。
考虑如果枚举了中间的点,两边的方案数是什么。即,一个点到一个矩形内所有点的路径方案数。
式子懒得写了,反正写出来之后发现可以上指标求和,然后进行两次上指标求和就可以得到一个四项的式子。发现这些式子等价于中间的点到四个点的方案数。那么我们直接枚举两个点是哪两个点,那么问题转化成了一点到矩形内一点再到一点。
然后考虑枚举路径进入矩形的点的位置,这样就能计算方案数了。对于中间的路径长度,我们可以差分一下,变成从入矩形的点到终点的距离减去从出矩形的点到终点的距离,然后就是直接枚举这个点是啥然后算一下即可。
2023.10.6
今日打模拟赛了,所以没更做题纪要,哈哈。【日总结】2023.10.6
没想到是 EI 出的模拟赛,呃呃了。
不过还是有一道题的。
AGC018C Coins
好像是典中典题了。建议改为:2023.10 补题纪要。
考虑先让所有人都选铜币,然后把问题转成两个币。
然后容易建费用流模型,然后模拟费用流,发现有四种情况:选金,选银,把金换银再选金,把银换金在选银。然后堆维护即可。
2023.10.7
P6782 [Ynoi2008] rplexq
首先题目要求的相当于就是
考虑根号分治,将度数
对于度数
但是我们再仔细分析一下,对询问再进行根号分治,考虑对一个点上询问数
两部分再平衡,即可得到一个总复杂度
考虑可以将第一部分的单次
【此处删除了一段假的再平衡,警惕单次询问低于
可以拿到 88 分,大概是卡不过去的了。
考虑想办法将第二部分优化到
那么考虑每次跑莫队的时候,如果有一个子树内已经跑过一个莫队了,那么就不考虑这个子树,仅对没有询问的子树跑莫队,莫队的时候将可能被访问到的节点拿出来离散化一下,这样莫队就是 比上面得出的算法少个
那么实际上直接取前
CF924F Minimal Subset Difference
全身心抵触写这道题,最终还是写了。
然后感觉快写自闭了,搜状态加卡时间卡空间,这是什么阴间玩意。
题解已经写过了所以不写了,直接扔个链接。
2023.10.8
这里本来应该是有一个 Ynoi Easy Round 的,但是天天数据结构感觉要爆炸了,所以咕掉了。
而且晚上 CF Div1 + ARC 联排,感觉会很累,所以上午做点简单轻松的东西(确信)。
P9067 [Ynoi Easy Round 2022] 虚空处刑 TEST_105
代码还没写,先把题解放这,反正题很简单。
树上同色连通块经典的考虑用连通块深度最小的点来代表,这样每个连通块相连的别的连通块分为它的父亲与其它节点向它连。考虑并查集维护,并在每个同色连通块内维护所有下方连向这个连通块的点的颜色。当修改这个点的颜色时,我们首先判断是否存在下方与它相连的连通块,然后将其父亲的连通块的信息进行修改,如果存在颜色相同则并查集合并。
现在问题是如何维护,考虑以颜色为下标建动态开点线段树,每个点的叶子处维护一个链表,这样合并时进行线段树合并,复杂度就是
CF446E DZY Loves Bridges
其实不是特别的难,只是需要一定的观察与耐心。
首先容易将题意转化成求一个
重点观察这个矩阵,考虑将较小的情况写出来,发现这个矩阵实际上是一个循环矩阵。
然后关于循环矩阵有一些性质:循环矩阵的乘积仍然是循环矩阵,且循环矩阵的乘法可以表示成一个关于矩阵
容易发现这个矩阵类似于一个置换,于是发现这个矩阵
拿
也就是说,这样的一个矩阵
用
而根据循环矩阵乘积的性质,直接考虑通过卷积的式子写出表达式,那么进行一次矩阵乘法后,应当有:
直接暴力计算系数即可,这部分复杂度
最后一部分是计算答案,同样写出卷积式子:
考虑枚举
注意到,后者的
常数很小,于是可以卡过去。
正解是这样的:仍然考虑矩阵
设
可以通过小规模找规律与归纳证明,对于任意一个常数
假设
可以得到一个式子,考虑一般化一下,然后考虑求
然后就是复杂度
2023.10.9
好耶,CF 上 GM 了,AT 上 3 Dan 了!
然后上午仍然打模拟赛,所以今天大概率又没有更新。
然后模拟赛垫底了。T3 写了一场假了,T4 没看。
然后发现 T3 诈骗题,T4 弱智题。
然后下午把昨天那道 Ynoi Easy Round 写了。
2023.10.10
感觉该学 whk 了!
CF1693E Outermost Maximums
好像并不是很难,反正我不会做哈哈,不过还是比较有趣的。
首先有一个显然的贪心策略:如果一个点左边小于它的最大值小于右边小于它的最大值,那么就在左边改,否则在右边改。容易发现这个条件存在一个分割点使得左边都是左边更小,右边都是右边更小,所以这种策略一定是可行的。那么直接维护这个过程就得到了一个
发现这个模拟的过程没有什么前途,因为这么做就必定需要维护每次操作之后的序列是什么,而这个序列是很难维护的。考虑将过程转置。这里有两种转置方法:
- 在值的位置计算贡献
也就是说,我们不去维护这个序列的值,也不计算每个值被修改了多少次,而是计算每个值被修改成了多少次。即,我们仅在这个数被修改成这个值的时候统计贡献。
那么考虑将每个数分为三种情况,分别是:“未确定选前缀还是后缀最大值”,“要选前缀最大值” 和 “要选后缀最大值”,我们把三种情况记作 O, L, R。
那么,当这个数第一次被加入时,状态为 O。考虑加入的每个数会对之前的数造成什么贡献。假如加入的一个数右边某一个数原来是 O,那么说明这个数一定会选后缀最大值(前缀最大值比后缀最大值要大,所以选后缀),于是将这个数变成 R。同理,若加入的一个数的左边某一个数原来是 O,那么将它变成 L。如果加入的一个数右边是 L,说明这个数就需要变成当前的这个值,那么就可以将它与当前的数看做同一类数,将它变成 O,同时将它计入答案。同样,如果加入的一个数的左边是 R,那么把它变成 O 并计入答案。
容易发现,每次进行上述的一次操作后,整个序列永远都是分成 L, O, R 三段,于是我们只需要维护这三段的两个分割点即可。每次操作计入答案的都是一个连续的区间,于是用树状数组维护区间内有多少值即可。
- 计算每个位置的贡献
我们还可以单独考虑每个位置会被修改多少次。
把问题转化一下,考虑将所有值放到数轴上,将左边的值染成黑色,把右边的值染成白色。那么我们每次变换所做的操作,就是将当前值跳到前面的第一个黑点或第一个白点,问跳到
CF1110F Nearest Leaf
哈哈,水题。
离线,考虑换根,由于 dfs 序连续,换根后每个叶子到根的距离可以动态维护,然后做完了。
P9530 [JOISC2022] 鱼 2
算是基本上自己想出来的吧?
考虑如果存在一个区间
考虑怎么查询。如果一个区间与询问区间有交,那么这个区间内的点就都不能成为答案,但是区间包含询问区间则不会造成贡献。这看起来很难处理,但是实际上如果我们不考虑这个条件的做法是找区间最小值的个数,而区间包含区间个数并不会使得这个数改变,所以仍然这么做就行了。注意左右端点需要单独处理,因为此时边界没有限制。
带修也就是简单的了,只需要将修改的点所在的区间重新求一下即可。
CF1368F Lamps on a Circle
小清新题,但是我怎么是弱智不会啊啊啊啊啊啊。
首先考虑找到答案的一个上界。发现,只要每一步操作后,没有连续的
2023.10.11
上午打模拟赛了,日总结,场上写两小时暴力大分块快写死了。
然后 whk 一会了,#1 完结,耶耶耶。
2023.10 To-do list 20/50,月底前能做完吗?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!