YL 24-CSPS 模拟赛总结

说明

原文是写在 notion.so 的,现在 notion 和洛谷和 cnblogs 三向更新。为什么呢?也说不上来。

好吧,该说一下阅读指南了。里面都是我模拟赛的一些总结,主要总结自己,没有想写题解一样的描述,最多写一点解法。前面的 2024xxxx 是日期,后面的 YLOI-R? 是第几场。祝阅读愉快。

以下是 notion.so 上的原说明:

此系列比赛由鸭梨官方举办,最终解释权为鸭梨恶臭公司。

说明:题目大部分为牛客 OI 赛前训练营的题。

20240923 YLOI-R1

依依寺(yiyi)

期望得分:[40,50],实际得分:0

博弈论,个人觉得比较难,评个黄~绿。

一开始题目直接读错,以为是一个人可以取多个数,多个数的总和 mod 30,然后写了两个 If ,然后就是大小样例双双寄掉。

后来,终于读对了,但是情况太多了,然后就漏了一些情况,还是没有分。在比赛中,我就往 mod 3 的方面去想,然后就没想成。然后,我就在想:要不要用大样例找规律?最后,确实是找出来一些不知道是真是假的规律。但是,还是不对。

正确的背包与我的背包只相差两步之遥,虽然这道题的暴力已经拿到,但对于 dp 的掌握及粗心的改正还有待加强。

武义寺(wuyi)

期望得分:30,实际得分:30

这种推式子数学题我接触较少。

一开始,我看到期望。吼,还好,我还学过一点点。答案不就是 val(p)n! 吗,那么 n!O(n) 解决。但是 val(p) 需要找规律,如果暴力的话时间复杂度是 O(n!) 的。然后打出了 n16val(p)。但是还是没有找到规律。

正解是让人呕吐的推式子:

暴力可行方案为 k((k+1)nkknk)

那么 val(p) 为:

k=1n(nk+1)k((k+1)nkknk)(k1)!

=k=1n(nk+1)(k+1)nkknk)k!

像这种组合排列的题,我大抵都接触的较少了。所以,我略需强化我的数学 whk 实力。

依久依久(yijiu)

期望得分:10,实际得分:10

送出题人两个字:恶心。

第一眼看到题目,感觉眼花缭乱,所以就跳过了。后来,才读懂题意。赛事想打个暴力,把一个数从 f86 开始分解,也就是从 1018 的最小斐波那契数开始分解。然后最后异或起来即可。然后,便开始想优化了。一开始想的是用 upper_bound 来缩小范围。可是,这没什么用。

这道题的考点是递归+前缀和,我们可以处理前缀异或和 S(n)=i=1nval(i),询问时计算 S(r)S(l) 即可。像这种题我已接触较多了,可我的脑子里这种思维含量较少。我需要较多的做这种题,多加训练。

补幺梨(pear)

期望得分:[40,50],实际得分:45

dp 转换图论,难。

看到这么板的题目,感觉很简单。然后,就是一眼丁真数据范围,寄掉。如果是 dp 的话,很简单,直接转移 fj=fj|fjai 然后去最大值即可,便打了 dp。然后看着数据范围的突破点,m 比较大,但又不是很大。想了很久还是没想出来,然后暴力大草 45 分。

真的没有想到正解是 Dijkstra,要把本来的 dp 思维转化为图论思维,离大谱。对于思维转化,还是比较弱的。

20240924 YLOI-R2

集合(set)

期望得分:[70,80],实际得分:60。原因:打表没打全。

考试时在想,居然 1n200,那么就是 O(n3),可不可以把每一次相乘的数拆成 3 个数相加呢?然后,就是没有做出来。然后,又有一个思路,统计每个数字出现了多少遍,结尾全乘起来。所以,就写了一个 dp 来统计。可是,dp 写挂了。出现了两个小错误,赛后才发现。然后,时间不够了,就打了暴力,打了 139 的表,就提交了。

正确的背包与我的背包只相差两步之遥,虽然这道题的暴力已经拿到,但对于 dp 的掌握及粗心的改正还有待加强。

出租(hire)

期望得分:0,实际得分:0

这道题一开始就没有太注意,磕完 T1 之后就去 T4 了,这个后面才开始做。一开始在想,可不可以用一个统计数组来实现 O(1) 转移,但是,这样可能会分不清 2(2+1)3(3+1) 的租客了。后来,就开始想暴力,但这样太麻烦,就处理了一会。后来,写成了一堆烂泥,然后只好输出 mYES

这道题是一道线段树的题目。可以考虑总房间数 k(rl+1+d) ,然后判断 k(rl+1) 与租客的差是否无解。

考试时很可惜,我没有想到线段树。这证明对题目的判断和思维能力不够强。像这种题,暴力应该是要拿到的,而本人缺没拿到,值得反思。

集合(block)

期望得分:[0,20],实际得分:0。原因:太弱了。

望着部分分表格中 “树均为随机生成”。我就在想,如果是随机生成的话,那么不满足 u,v 不同时存在于这个连通块中或 u,v 在这个连通块的概率很小(实际上不小)。再根据 m20。所以应该可以把全图非负的全部加上,然后就挂了。

这一题巧妙地运用了图论。我本身就对图论的理解不是很强。这一题近似树状 dp,这种题我接触较少。

跳棋(checkers)

期望得分:[0,10],实际得分:0。原因:太弱了。

考试时望着一堆部分分,一眼就定住了全是 ? 的 Subtask,分比有些 Subtask 多且看起来有规律。

直接手动模拟+暴力求出 n17 的数字,分别为 2,4,10,26,。然后使用瞪眼法,还是没找到规律。

本题的考点为 dp。我们可以设 fi,j,k,0/1 为表示已经填了前 i 位,有 j1k0i 是否可以在后面接一个 1 变成 11。最后对于每种情况乘 Cii+j。实际上,可以把第一维压缩成 0/1

这一次考试有两个 dp 题,都没能做出来,这说明薄弱点在于 dp,有待继续深造。

20240925 YLOI-R3

变幻(change)

期望得分:60,实际得分:60

写挂的贪心居然还有 60 分。

开始以为改了之后有后效性,所以就没有用可爱的 DP。然后就用了贪心,循环 k 次表示每次改动。每次改动取能改动的数改成低谷后的最大值,一个数需要满足本身不是低谷且两边的数都不是低谷该能改动。然后就是大样例寄掉,总少那么一点点。

正解其实是 DP,对于判断能力我还是都待加强。我们可以设计一个三维 DP fi,j,0/1,其中第三维表示上一个位置是否被改变过,i 表示当前位置,j 表示之前已经变换过 j 次。

交替(alternate)

期望得分:40,实际得分:40

暴力,启动!

首先是打了表找了规律,大概是:

n = 1:   a[1]
n = 2:   a[1] + a[2]
n = 3:   a[1] - a[3]
n = 4:   a[1] - a[3] + a[2] - a[4]
n = 5:   ......
......

找了一个小时还是没找出来,迫不得已暴力直接 40 分。

这道题确实是一道找规律的题目,这一题的关系在系数,可以发现系数与杨辉三角有关。对于简单的找规律题,本人还是能轻松做出来的。但如果稍微复杂一点就做不出来了,这说明对于找规律题还有待加强。

打拳(box)

期望得分:20,实际得分:20

全排列+分治+DP 大草 20 分。

题面看了很久才看懂。

看着 1n91m16,感觉很简单。可爱装压 DP?看着不像啊。然后定住了 k=1
Subtask。然后也是失败了,就用全排列枚举,用分治维护谁赢,用 DP 来维护 LIS,成功 20 分。

这道题虽然较难,可是我还是把该拿的分拿到了,但不是很完美。也没有考虑完全装压 DP,最近的比赛有很多数学题,我都没能做出来,应该反思。

扑克(poker)

期望得分:0,实际得分:0。原因:太弱了。

一看到扑克大模拟,没有太大希望。感觉情况很多,打 20 分代码。后来打着打着,就觉得情况太多了,同花顺、四条……都要考虑到。然后打出了一堆长长的代码,卡死了。就一直 Debug,最后还是放弃了

这道题严格上不算大模拟,但是还是得有一定的代码能力和思维能力。我们可以大模拟枚举所有五元组,然后再可能的情况下二分。我对于这种大模拟的码力还有待加强。

20240926 YLOI-R4

智乃的差分(difference)

期望得分:[10,30],实际得分:0

原因:x=0 写挂了。

直接开启大分讨,分别用 x>0x=0x<0 来判断。 x>0 直接倒序输出,x<0 正序。但是,当处理到 x=0 的时候,却卡住了。怎么判断 Yes,怎么判断 No。后来,想了很久才想出。然后,想出来的被轻松 Hack。哦吼,完蛋。我一直思考着,直到去了趟厕所,茅塞顿开。只需要判断相同的数是不是 n÷2 即可。然后,就是漫长的 Debug。可是,这种情况非常复杂,调了 114514 年还没出来。我以为不判断 x=0 有分,然后就是 0 pts 大挂。

知道比赛结束还没有搞明白这道题,后来看题解,还是没把 x=0 的情况看懂。什么队列,map,看得我眼花缭乱。总结一句,对代码的处理有待加强。

牛牛的旅行(tour)

期望得分:0,实际得分:0

什么?如果 LCA 没 WA 可以拿 60???!!!

原因:LCA 写挂了。

嗯,一眼不会,直接打暴力。但是 n1000 直接搜是 O(n2(n+m))=O(n3) 的,需要用 LCA 优化成 O(n2logn)。然后,漫长的 LCA,终于写完了。耶,样例输出 34,错辣。检查了一下路径计算,depx+depy2depLCA(x,y) 也没错啊,然后又打了个 10% 数据的 vali 值相等的乱搞,然后以为有 30 分。

题解中说 “如果学树分治或者树上 DP 学傻了可能往这两个方向去想就偏了”。这道题要把问题拆开,转换成求 sthappy(s,t)stlen(s,t) 独立的两部分,分别求解。所以,做题不能太死板。

第 K 排列(permutation)

期望得分:[5,10],实际得分:20

什么?输出 1 可以得 20 分???

考试时一眼没看,觉得太难了,就先去做 T4 了。最后看这道恶心题,就输出了 1

考后看了题解,什么?DAG 图上 k 短路问题?哦,原来只需要把 k 短路转换成 O(nk) 的 DFS 利用动态规划进行剪枝就可以了。第一次比赛也出现了转图论问题,真的没有想到正解是 DFS,要把本来的数学思维转化为图论思维,离大谱。

牛牛的 border(border)

期望得分:30,实际得分:30

叫我骗分大王!!!

一眼 KMP?假了!然后直接 1N3000 和仅有小写英文字母 a 组成直接启动。打暴力时出了点小问题,没有 reverse 。仅有小写英文字母 a 的公式为 i=1ni(i1)2(ni+1)。然后获得 30 分佳绩。

这道题有一个新知识,后缀排序,我大抵都接触的很少了。这道题的思维能力很强,我需要加强。

20240929 YLOI-R5

光(light)

期望得分:70,实际得分:70

评价:中规中矩。

考试的时候觉得 Θ(n4) 拿的太少了,就思考 70 pts 的 Θ(n3)。可以分别枚举左上、左下、右上(a,b,c)的耗电。根据 a,b,c 分别的耗电和亮度,直接算出 d(右下)。我们把满足 a,b,c,d 达到要求至少所需的能量取 max 作为 d 的耗电。计算答案时直接取 min 即可。

没有想到这一题是伪整体二分,我以为是枚举两个 for 循环直接计算。没有想到这题整体具有单调性。这一题整体偏贪心,但又不算贪心。对于这种题目,思维性比较强。

爬(climb)

期望得分:10,实际得分:10

考试时一眼树形 dp,没想出来。然后打了 10 分暴力,枚举每个蚂蚁是否跳到父亲节点,然后统计每个的节点有多少蚂蚁,计算即可。

这道题的考点是二进制,我们可以考虑每个位置每个二进制位对答案的贡献。在考试时,如果遇到这种题,我们可以考虑状压 dp 或根据二进制的性质来解决问题。平常,我对二进制的题接触较少,所以不是特别熟悉。对于装压 dp,我大抵都已忘记了,所以觉得还得去 oi-wiki 学习一下二进制。

字符串(string)

期望得分:20,实际得分:20

考试时打了 20 分暴力。直接枚举当前位置是填 A 还是 B,然后边填边计算,最后取 max 即可。

考后看了题解,才知道我们可以对字符串进行简单分析,用贪心的思想来思考怎样设计才能使得权值最大。其实这道题的思路不难理解,我们可以枚举 AB 切换了多少次,然后考虑 A,再考虑 B。然后经过计算,就可以得出答案。

奇怪的函数(function)

When 1n1051q3×105O(nq)=Θ(180nq)。——Holzky Gould (Eng)
1n1051q3×105 时,O(nq)=Θ(180nq)。——霍尔兹基·高德 [英]

期望得分:5,实际得分:75。牛逼!!!!

出题人因为卡正解,出了卡正解 Θ(logn) 处理 max,min 值的数据。导致暴力直接退化成大约 Θ(180nq) 级别,直接卡过(除全是的询问的特殊情况)。考试的时候看到暴力只有 5 分,没有报太多希望。然后看特殊性质,每一个会的都没有,然后就成功打了暴力。

这一题的正解是线段树,线段树处理最大最小的模板忘记了,就没有打正解,回去回炉重造线段树。再一个是,这道题还需要用到分段函数,这个东西需要一定的数学能力,我还需要加强我的数学。

20240930 YLOI-R6

博弈(game)

期望得分:0,实际得分:0

太难辣!!!!!

考试的时候一开始准备用 Θ(n2(n+m))=Θ(n3) 的方法做。先枚举点对 (u,v),然后用 Θ(n+m) 的 Dfs 来求出 S 数组,然后再判断先手是否有必胜策略即可。但是,部分分 1n5000,就算写了也是 0 分大挂。

这道题的知识点是 Xor-Hashing,我之前没有接触过。看了题解的博文我才知道,这是一项要掌握的技术。主要出现在使用 XOR 时,我们计算每个元素的出现次数是偶数还是奇数,而不是实际出现次数。像这种我还没有接触的技术,我觉得应该学习学习。

跳跃(jump)

期望得分:20,实际得分:20

DP 已经把我绕晕。

考试的时候一眼可爱 DP,虽然考试时想的是二维,用 fi,0/1=v 表示在 i 位置,是向左还是向右,v 表最大分数。然后就是想不出来,就打了 20 分暴力。枚举当前点可以往哪跳,然后直接搜索。

考试的时候想假了,我们可以令 fi 保存从 1 跳到 i (下一步应该是以 i 为右端点的区间,进行一个反复横跳)所需要的最少次数,和跳到 i 以后的分数。近期的 DP 题我都没有想出来,说明我的 DP 还需要加强。

大陆(mainland)

期望得分:0,实际得分:0

最近怎么这么喜欢考树?

考试时也是成功的把问题转换成:构造 1kn 个节点集合(大小位于 B3×B 之间),使得每个集合要不是一个连通块,要不然可以通过加上一个点变成一个连通块。然后就在想,是不是可以把树划分成若干个连通块?嗯,不会。然后直接跳过。

对于数据结构,我还是有待加强。最近的考试中,树出现的较频繁,而我也是都没有想出来。这道题代码其实很简单,可以用 DFS + 栈来实现。

排列(permutation)

期望得分:40,实际得分:40

最近怎么这么喜欢考树?线段树、平衡树……

考试一眼觉得是线段树或者平衡树,不会。然后看到暴力居然有 40 分,感觉比其他题实惠。右移 k 次其实就是把后面 k 个数给他直接倒序放在前面来。然后我们可以做一个 Θ(n2) 的 dp 来维护序列的 LIS。只要 maxfi 大于等于了 3,就一定存在三元上升子序列。为什么呢?你看,最大的上升子序列长度都 <3,难道还有其他的 3 的吗?

题解看不懂,平衡树只会模板。

20241002 YLOI-R7

由于 CCF 在 2022 年发射的 “CSP-Senior” 宇宙射线通过一年一个省份的速度到了湖南长沙,并把今天的模拟赛的数据破坏了,导致 T1 和 T2 数据出锅。

躲避技能(skill)

期望得分:40,实际得分:20

数据出锅了,居然没有单独 1m10 的数据,LCA 是 O(nlogn+mlogm+m!mlogn) 的,是可以过掉 40 分的。结果数据只有 n,m10 的,啊……

考试时一看,wi 为什么要倒着给出。欧,原来 1wi10100,方便高精度运算。啊?高精度,直接放弃正解。线性的 1n,m105 不会,直接考虑 40 分解法。直接 LCA Θ(nlogn) 预处理,然后就可以 Θ(logn) 算距离:Dis(x,y)=disx+disy2disLCA(x,y)。有了 LCA 开挂,我们就可以愉快的枚举 m 个账号的全排列(next_permutation),然后枚举 m 个账号。对于每个账号,直接计算 i=1nDis(si,ti),最后取每个的 min 值就可以解决问题了。

这一场比赛又双叒叕考了可爱的树。这一题还要高精度,我大抵已经忘记了。所以回去还得回炉重造一下高精度,让自己二次复习。这一题的解法需要用到贪心,而贪心又需要较强的思维能力。主要的思路可以从这句话体现:对于每一棵子树,先跟子树内的起点和终点匹配,匹配不了的再到子树外去匹配。

但是,这里主要的丢分点在脚客牛客的数据,居然没有让 LCA 过的数据,pty 还说不如写 80 分的 1n,m105。这属于一种歧视 LCA 的行为,严重批评

奶茶兑换券(tea)

期望得分:[0,5],实际得分:0。骗的大样例。

赛时看题,感觉题目很抽象。第一眼感觉跑背包,但是 1n1051ai109,直接寄掉。然后看部分分,但也只是 n 的范围减小了,也不行。问题可以转换成:把奶茶分成若干个组,使得浪费最少。但如果这样理解的话,这道题会变成 DP。居然转移方程和状态都想不出来,就去看 T3 了,后来看这题直接骗了大样例。

虽然这道题没有想出来正确解法,但我觉得骗不到分非常不应该,暴力也没有想出来。这道题的贪心思路不是那么难,也还是让人觉得不难理解。算法是双指针,主要就是要双指针来匹配,让所有 >m2 的奶茶从大到小匹配。于是。这道题完美转换成了匹配问题,可以完美解决。

帮助(help)

期望得分:30,实际得分:30

一开始看到这题,就在想:像这种题,一定是要转换的。于是我思考了图、树……等等数据结构,甚至想到 Dijkstra 了。还感觉这题可以用区间来理解并解决,只不过没有想到正解的扫描线。没办法,扫描线不是很精通啊,打 1n1000 的暴力。暴力的主要思路就是枚举 ij 两个人,看是否 i 愿意帮助 j,且 j 接受 i 的帮助。如果可以,j 加上 i 做的题目数。注意,这里要判断自己帮助自己,因为 i 也可能满足自己的要求,所以必须特判。时间复杂度 Θ(n2),可以拿 30 分。虽然这还可以用树状数组来维护,但是用了等于没有用,还是提不了分数。

这道题有很多部分分,可以我只骗到了暴力,其他的一点都没有骗到。这道题的解法是扫描线。对于扫描线,我之间是接触过一点的。扫描线基于线段树,它一般被用来解决图形面积,周长,以及二维数点等问题,而且能有效地解决区间问题。主要就是以扫描每个区间。我与满分擦肩而过,实在很可惜。这道题其实还可以用树状数组加上离散化做,主要思路就是递推。用 s 数组表示表示所有成绩为 j 且愿意帮助成绩为 i 的人,所做题目数量之和,然后推出每个人受到帮助后的题目数量。

神奇的变换(change)

期望得分:20,实际得分:20

被 T4 硬控半小时。

题面过于冗长,也挺幼稚。主要就是把一个数列进行分解质因数、因数和、因数个数,还强制在线。一看到这种题,一定是数据结构。首先我就猜到了分块,没想到猜对了。但是,想到了有什么意义,反正也写不出来。直接写 Θ(nqi=lrai) 的暴力,用前缀积优化。可过 n=1q=1 的数据,可获 20 分。但是,样例错了,一直不知道哪里错了,直接红温肘击电脑。后来发现只是答案输出错位,看来 Debug 能力有待加强。

我在考试中骗的分数不满意,没有想到 i=lrai107 的情况下,可以用质数筛来筛出来。序列直接做前缀积,逆元就可以了。但是,我猜对了,这道题的正解就是分块。但是,分块我还是学的不精通,只会一点点。pty 说这道题有三个点:在线、区间、分解质因数。像这种题,一般是要发现一些数学性质,用这些性质来做出这道题。比如说,这道题有一个性质:序列中的每一个数字,最多只 “包含” 一个大于 1000 的质数。发现了关键点后,我们就可以来仔细分析题目,然后解决。

20241003 YLOI-R8

总和(sum)

期望得分:100,实际得分:100。Easy!

这道数学题还是很简单的,首先知道填的方法有 mn 种。然后,对于序列 [a1,a2,,an],重复情况只有当 k1m 的时候,才会与 ai+k 同余(mod m)。所以重复的有 m 种,那么答案为 mn1

这道题巧妙地运用了数学思维,通过推理得出答案的题型很多。但是,这题 AC 不代表我能 AC 所有的这种题型的题目,还得举一反三。顺便说一下,从 R1 以来只 AC 了这一道。

水果加工(fruit)

期望得分:40,实际得分:40

题面过于冗长……考试时看到这道题,这题面是给人读的吗。然后经过我若干时间的精密分析,题面终于理解了。就是有 n 个果园,要送往 2 个加工厂,然后给定运输成本,果园机器数,以及一堆东西,要把水果用机器加工,让你算合法完成水果加工所需要的最小时间是多少。

题解说过掉 58 测试点要写 Θ(b2ai) 的背包,但我写的 DFS 就这么水灵灵的荣获 40 分了?万能的暴搜 DFS,枚举每个点分别给两个基地分配多少水果,加上一点奇怪的剪枝,比如果 b0<c0,ib1<c1,i,那就直接 return 。分配完之后就用公式计算,然后答案取 min。时间复杂度大概 O((ai)n)。最近是原来越会骗分了,也会打一些优质暴力。话说 DFS 还是挺万能的,啥都能解决。

最佳位置(location)

期望得分:20,实际得分:0

不知道为什么暴力挂了。

题面简洁,好评。暴力的思路:第一个人直接坐 1,第二个人直接坐 n。对于其他人,枚举 n 个座位。如果是空座位,枚举与其他非空座位的距离,然后取距离 min。最后,取最大的距离 min 值的座位坐。样例过了,不知道什么挂了。都来把距离修改成数组,disi 表示座位 min 值,就直接过了。时间复杂度 Θ(mn2)

这道题的正解是 STL 大合集,直接放弃了。

跑步(run)

期望得分:60,实际得分:75

Linux 牛逼!

使用 LCA 大法,首先用并查集跑最小生成树,然后连边之后把 LCA 初始化。初始化完后输入 k 个点,利用公式 disx+disy2disLCA(x,y)+(depx+depy2depLCA(x,y))t0 来算出从上一个点到这一个点花费。这里要特判一下,如果上一个点与这个点相同,那么不计算,因为重复。然后,以为能拿高分,结果才 75。一看,把 LCA 里面的 logn 看成 60,所以空间复杂度 Θ(nlogn)=Θ(60n),加上其他直接爆,还开了 long long。

虽然时间复杂度还是 Θ(mlogm+klogn),但是空间直接爆掉了。主要失误是在 LCA,而且没有算时间复杂度。离正解就差一步之遥,实在太可惜了。奉劝大家 CSP 的时候算算复杂度再打好代码,真的是血的教训。

20241006 YLOI-R9

喷泉(fountain)

期望得分:100,实际得分:0

继上次的 T4 MLE 事件,这一次又是 Shadow y1 事件。真的非常难受,答辩 VS Code 没有识别出 y1 是库函数,就直接给我屏蔽掉了,没报错。吼?关键是,我居然还没有发现,然后就快快乐乐的提交了。考完交补题,编译错误?然后成功发现偷偷藏在代码里的 Shadow y1,然后寄掉。虽然 Lemon 上评测成功了(windows),但不算最终成绩!然后 Shadow Linux 直接给我报错,直接 175100=75 分到手!Cnm。pty 说赛前已经强调过了,变量不能建 y1,所以不能改代码。这东西跟开头那就搞一道几何 T1 帮助大家爆零成功呼应,坑点是这东西,实在是没想到。

回归解法。我们通过图 1 理解。先来探讨 r=0 时鸡尾酒在躲狗的时候的最远距离。首先,我们肯定知道,鸡尾酒肯定要离 D 点最远,也就是从 C 点到线段的距离尽可能长。那么,鸡尾酒只可能往 AB 点方向走。而鸡尾酒又要尽可能远,那么只能远到 A 点或 B 点,显然答案就是 max(AC,BC)。那如果 r>0 怎么办?我们看图 2,小狗在躲避时肯定不会到 Q 点。而是绕到与 B 点最远的 E 点,使得距离变为 BC+r。所以说,答案为 AB 两端与点 C 的距离加上半径 rmax 值。

然后探讨 r=0 的最短距离,我们把两人的家 AB 和喷泉中心 C 连起来成一个三角形,然后根据欧拉公式 Dis(x1,y1,x2,y2)=(x1x2)2+(y1y2)2 来算出 AB, BC, CA 的距离。然后根据海伦公式 p=12(a+b+c)SABC=p(pa)(pb)(pc)。显而易见,最短距离肯定是三角形的高 h,我们知道 12ah=S,那么 h=2Sa。所以答案为 2Sa。那 r>0?显然,图 2 小狗会呆在最近的 C 点,而不会外绕其他点,所以减去 r 即可。所以答案为 2Sar。最后记得保留二位小数。

图 1:

图 2:

红绿灯(light)

期望得分:[70,100],实际得分:70

第一个点 TLE?欧,没有特判 m=0

一眼定准 Θ(nm) 暴力 50 分,枚举 1n 的时刻,然后枚举 m 个红绿灯。判断当前时刻 t 是否为 ai 的倍数,如果不是,那就增加到 ai 的倍数。也就是把 t 增加到 ai(tmodai),但当 ai | t 时,不需要进行操作。然后就是看到了 ai2,3 的循环的 20 分,用暴力找规律。规律是:当 m4 时,答案就是从 6 开始一直输出,每隔 6 个数把输出的数 +6。当 m<4 时,交给 Θ(nm) 暴力。

写完 70 分解法之后,突然开窍。当通过第 1 个红绿灯时,1ai 时刻出发的都会在时刻 ai 到达第 2 个红绿灯,ai2ai 时刻的会在时刻 2ai 到达,(2ai+1)3ai 时刻的会在时刻 3ai 到达,以此类推。而接下来红绿灯的也是同理,根据到达时刻来分组。例如,当 n=10m=3a=[2,4,3],分组如下(① 表示第一个灯,圈表示一个组):

如此下去先分治把组数压缩,再展开,就得到答案。但是实现麻烦,所以只压缩了第一个红绿灯的分组,直接枚举每个组,在组内随便选一个初始时刻计算到达时间即可。时间复杂度为 Θ(na1m),当数据的 limit(也就是 ai 随机范围)足够大时,可以 AC。然后可能数据较强,只能卡到 80 分。但是,我没有特判 m=0,导致 i += a[1] 死循环,直接寄掉 10 分,变成 70

具体实现如下:

for (int i = 1; i <= n; i += a[1]) {
  ll ans = i + a[1] - 1; // 初始时刻,这里取组内初始时刻最大值
  计算到达时间...
  for (int j = i; j <= min(n, ll(i + a[1] - 1)); ++ j) {
    cout << ans << ' ';
  }
}

集合(subset)

期望得分:10,实际得分:5

为啥?

题面公式较为抽象,什么 xS 的抽象东西。花了好久才看懂,还是得借助样例。看到 1k109,觉得肯定是 k 次方或者乘上 k,反正不是大于 log 级别的。然后觉得这一定有一个递推式。然后没想出来。选择了 k=11n,m10 的部分分。主要思路就是枚举 S 的子集,判断这个子集和是否 =m。如果是的,答案 +1。特判 m=0,直接输出 1,因为只有空集是符合要求的。时间复杂度 Θ(n!n)。然后思考 ai=1 的部分分,没有找到规律。然后不知道为什么,挂到了 5 分,没有取模?不是。

还是太菜了,没有接触过太多关于集合的东西。也不是很理解集合的思想。回去多学学集合,为 CSP 打下基础。我需要注意编程细节,加强数学和算法思维,以及扩展知识面。

佛怒火莲(fire)

期望得分:[0,30],实际得分:0。骗的大样例。

第一眼看到 2k5,直觉 2k 状压 DP。但是,不知道怎么设计状态。然后就看到了 1n100 的数据点,直接搜索。枚举每一个火焰要选哪个,如果这个属性的火焰之前没选过,那么就选。但是,我的暴力的时间复杂度是 Θ(nk) 的,于题解说的 Θ(Cn5) 完全不同。测了大样例,最后一组变强卡过,但是输出 0。然后直接偏离样例,惨痛离场,至今也不知道为什么。

不知道为什么爆掉,以后得好好检查代码,增强 Debug 能力。正解如我所愿,是状压,我对状压的状态设计还不是太熟练。回去要多多练习状压 DP,多做题。

20241007 YLOI-R10

R10 大庆!

通过了 R1~R9 的历练,今天终于迎来了 R10 大庆。比赛进入了高潮,今天的题格外难,两题都考了期望,我接触的很少。另外两题也比较难,一道还要数形结合,难。而且本场的暴力分也比较难拿,需要一定思维。

我是 A 题(A)

期望得分:30,实际得分:40

这得分,啊?

花了 2 个小时。一开始一直在想:删除不大于 (u,v,w) 的相当于删除了 u×v×w 个,但是怎么去重?然后看到 “请选手仔细观察给出的数据生成器,数据生成方式与解题强相关”。吼?那就开始 ”仔细观察”。观察到发现在随机 u,v,w 之后有三个小 if,发现有 13 的概率 u=A,还有 13 的概率 v=B,如果都没有,那么 w=C。也就是说,u,v,w 总有一个为极值。有了这个性质,题目就简单多了。

我尝试的把样例的 u,v,w 输出出来,发现满足 u=Av=B 的操作很多,甚至有三个都是极值的。然后经过我的探索,发现只要当 n 足够大,A,B,C 较小时,输出 A×B×C90% 以上的概率可以通过。更详细地说,当 nmax(A,B,C) 的比值 [100,1000] 时,答案有很大的概率为 A×B×C,因为生成出这种情况的平均概率为 13×13×1C×n=n9C。这个结论足以通过测试点 361415(开始时以为只能通过 36)。较小的测试点 12 交给 Θ(n×A×B×C) 暴力。

做完这些,我有继续思考正解。当时想,其实每个操作都可以分成两类,第一种为 u=Av=B,其他统一为第二类,输出答案为两类相加。第一类只需要统计 wmax 值,答案即为 A×B×maxw。而第二类维护较难,需要对 (u,v,w) 去重。首先考虑了第三维,如果 w 小于等于第一类的 maxw,不做计算。因为这样的话已经被第一类计算过了,读者可自证。但是,花了很久时间也没想出怎么去重,交了 40 分代码。其实数据比较水才导致我可以通过 1415,那个测试点的 nmax(A,B,C) 的比值才达到 10,理论上通过概率较小。

虽然我的暴力骗分能力有进步,但还是不够好,今天的暴力两题都没有骗到手。还是很菜,的提升一点骗分能力,为 CSP 打下基础。

我是 B 题(B)

期望得分:0,实际得分:0

第一次见负概率。

考试时看见题目,期望?又接触到了准知识盲区(还是接触了一点,懂概念)。然后看到有 1pi 的概率通过,什么?负概率我还是真没有见过。然后就开始推理,每个东西到能成功活下来的概率为:1|i=1n(pi1)|,然后把 n 个物品组合出的概率再组合一下就为期望。但是,我怎么想都没有想出来,期望的分母应该怎么求,就放弃了。然后暴力不会打,直接大样例启动。

正解是熟悉的概率 DP,概率 DP 是我接触最少的 DP,只做过一题。我觉得从现在开始,应该把概率 DP 快速选一下,下次碰到期望就可以不那么困难了。

我是 C 题(C)

期望得分:35,实际得分:45。不是?

题目比较简洁,易理解。感觉有点像滑动窗口,但是想不出来。直接打暴力,倒序枚举 k,每次遍历数组中长度为 k 的窗口。统计窗口内的每个数字,如果每个数字出现次数都 k,直接输出 k,因为 k 是从大到小枚举。时间复杂度 Θ(n3),跑不满。然后又看见了 b 全部相等的 20 分。有大概率可以输出 0,因为 bi 在随机数据下比 a 所有数出现的次数都大的概率比较大。所以,如果 1n300,打暴力,否则就输出 0。但没想到数据这么水。

这道题的正解是分治。主要是没有考虑到 b 有单调性,因为 b 是单调下降的,所以 k 越大要求的出现次数就越多。一个数字 x 导致一个区间不可行,那么这个区间所有包含 x 的子区间必然也不可行。虽然这道题的暴力分我拿到了,但是我觉得我太蠢了。因为我的暴力思路本来可以写 Θ(n2) 的,可以我就是写了 Θ(n3)。就是枚举左端点,然后滑动窗口,不断扩大长度,一边扩大一边统计出现次数。最后取符合要求的窗口长度的 max 值。

我是 D 题(D)

期望得分:0,实际得分:0。难!

考试时根本不理解极长相等子段是什么意思,猜测是最长的每个元素都相等的字段。然后读着读着,期望?又是期望?因为不理解什么意思,就没有思考,胡乱输出了 n2

看来题解的转换,我才恍然大悟。哪一坨屎就相当于满足 xi=xi+1==xj 的数对 (i,j) 的数量。有了这个转换,我们就只需要算出,满足 xi=xi+1==xj 的概率和就可以了。这道题可以用线段树维护,在 Θ(nlogn) 内完美解决。

20241009 YLOI-R11

今天的大样例前面的 ex 按照平常来说是大样例的意思,然后这次是题目名。(此处应有配乐, →→→↗↗→→→……)。

矩阵交换(change)

期望得分:100,实际得分:0。绝望。

继上次的 Shadow y1 事件,这一次又是 Shadow ex 事件。考试的写完代码后看到大样例写的 exchange1.in,就以为 ex 是大样例的意思,然后就建了名为 change 的文件夹,名为 change 的程序……然后当我自信的提交吃完饭回来后,看到评测机上面的题目名是 exchange 就崩溃了。然后就是 1000

我的思路比较直接。可以按行排序,因为我们要保证每一列单调不减,所以在排序时按照第一个不相等的元素从小到大排序。排序后检查一遍数组的每列是不是单调不降序列即可。这样做其实是为了尽量保证面的数是从不降的,同时这也可以保证有解时后面的数字可以排序成功,因为题目中是一行为整体。不会出现输出无解但是有解的情况。举个反例,比如说,像这种:

[312123]

排序后是这样的:

[123312]

后面的单调不降了,但是前面的乱了。但是,像这种矩阵不管是什么形态,都无解(可自证)。前面说了题目中是一行为整体,我们也是按行排序,所以各种无解情况在排序的时候就一定会体现出来了。

代码实现很简单,可按行开结构体。时间复杂度 Θ(Tnmlogn),排序中比较函数是 Θ(m) 的。

砖块摆放(trick)

期望得分:40,实际得分:20。绝望。

感觉想哪里见过一样,原题吧?

考试时看到这道题,总感觉它有一些异或的性质。比如说 xx=xxy=(x+y)modz。然后看了看大样例,发现输出一定是 A, B, C 中的一种,不会产生另外的颜色。突然,想到了可以把 A, B, C 转换为数字或者二进制来解决此问题,因为 A, B, C3 种颜色,所以就想到了是不是可以用 3 为主体的运算来得到上一个颜色。但是估计我的眼睛不够大,瞪眼法没练够,没搞出来。

然后就是打了 Θ(n2) 暴力。枚举 n1 次,模拟摆放,然后根据题意模拟出上一层砖块,然后把上一层砖块拿来做上一层来推导上上层的颜色。但是,20 分远远不能满足我。所以就打了接下来二十分,字符串仅包含两种字符且交替出现。很简单,往上推第二层,全部都是另一种颜色,如:

\ \ A\ \ \ A\ \ \ A\ \ \ A\ \ \ A

B\ \ \ C\ \ \ B\ \ \ C\ \ \ B\ \ \ C

然后,如果相邻两个是相同,那么上一层相同。所以,砖块就会一直相同下去,直到到达顶峰。所以,答案即为最后一层没有的那一个颜色的砖块,Θ(1) 完美解决。但是没搞懂这 20 分为什么错,欧,原来是这种错误(直接挂掉了):

 if (s[0] == 'A' && s[1] == 'B') {
    ans[0] = 'C';
 } else if (s[0] == 'A' && s[1] == 'C') {
    ans[0] = 'B';
 }
 ......

打完后,看一下在下一个 20 分的,感觉没什么规律,跳过。

这道题的整解我已经理解,就是把 A, B, C 转换成 0,1,2,假设这一层相邻的两个砖块的颜色为 x,y,那么上一层的颜色为 (x+y)mod3。然后根据观察,顶层的值的系数跟杨辉三角一样。如 n=5 时,顶层的颜色为 (x1+4x2+6x3+4x4+x5)mod3。然后还要判断正负。时间复杂度 Θ(nlog3n)。这道题虽然理论上我的暴力分拿到了,但是我觉得我还是缺乏这种数学思维,准确来说找规律思维还没有完全训练好。我觉得应该多做做这种题提升,这种情况已经出现过很多次了,但是就是有点懒,还是得提拔一下。

学习 LIS(lis)

期望得分:10,实际得分:10。绝望。

看到了题目 1n20,要不超级剪枝搜索,要不 2n 状压 DP。但是状压太难了,不会,暴力启动。我们可以暴力来搜每一个数,选择可能得值,也就是 [1,m]。当 m 个数全部分配完之后跑一个 Θ(n2) 的最长上升子序列(LIS,转移方程 fj=max(fj,fi+1))。时间复杂度 Θ(nm)。但是,我明明可以在搜索的过程中就做好每个元素的 LIS,在分配值的时候就开始检查并且可行性剪枝。如果这第 i 个元素分配到值 xO(n) 检查 lisi,如果不符合直接剪枝。虽然时间复杂度最坏 O(mn),但是可以卡过 1n,m10 的数据。

问题主要体现于状压 dp 能力较弱,看来目前状压 DP 还没有复习完全。

战略轰炸(bomb)

期望得分:0,实际得分:0。绝望。

感觉题目非常不清晰,一开始感觉是道不可做题。后来才想到,暴力 4 分感觉太不起眼,考虑了特殊性质 A。然后发现做不出来,拜拜。

这种不会的题一句话:菜,就多练。

20241010 YLOI-R12

收集植物(collect)

期望得分:0,实际得分:10。嗯?

考试第一眼看到这道题,感觉题面比较模糊,就直接跳过写 T2 了。后来回来看这道题才把题意看懂,然后就开始思考,怎么购置植物使得最优?难道把价格 k 的全部买了,无法达到最优。然后就想到了每个购置的于下一个购置的会形成一个区间,如 [3,2,5,4,1,6] 购置 2,1,那么会形成两个区间,[5,4][6,3],那么可以通过购置的来变出这个区间内的植株。我考虑到了枚举购置 k 棵植株,然后购买 k 棵价格最小的植株,用这些植株来变出剩下的植株,每次用标记来判断那些植株是有的。时间复杂度 Θ(n2)

可是,这显然是一个错误的解法。所以,就直接打 Θ(nn)20 分暴力。枚举每个植株买还是不买,然后枚举完后来运算需要多少次才能使得全部的植株都有(跟题解不同)。但是,由于没有计算变换植株时原来的植株所需要的花费,所以 WA 掉。后来因为时间不够,直接输出 i=1nai,居然还有 10 分,因为有个数据点 k 很大,ai 很小。

这道题的正解是二分+ST/三分+单调队列/倍增。我还真没有看出 k 可以表示为一个单峰函数,可以直接三分,就连这道题有倍增做法都觉得奇怪。这道题的暴力分居然没拿到,很不应该。还是缺乏思维,虽然底子是有的,但是拔高不够。

美丽子区间(interval)

期望得分:40,实际得分:40

看到这道题,第一眼感觉是 RMQ,但是没有猜到是单调栈(话说 ST 表的时间复杂度好像比单调栈跟优啊)。但是就算维护了区间,也不会轻易知道区间最大最小值的位置。好吧,没办法,想不到容斥,暴力吧。

这一次差点又上当了。一开始想的是枚举区间左端点和有右端点 i,j。然后 O(n) 求出这个区间的最小最大值,奇怪的是,我还想着 Θ(nlogn) 的排序。然后求出来后对比位置,检查即可。但是,这 Θ(n3) 东西是给没有脑子的人的,实在可以 Θ(n2) 啊。用 Θ(n) 来枚举左端点,然后向右滑动窗口,一边滑动一边来更新最小最大值,把位置要记录下来。每滑动一次检查一次位置,如符合要求答案 +1

要脑子的暴力分拿到了,比较满足。这道题需要容斥来解决,具体就是把总区间数减去不符合要求的区间就可以了,具体的,优美区间的数量为:总区间数 - 最大值在开头/结尾的子区间数量 - 最小值在开头/结尾的子区间数量。但是,这样子的话最小值和最大值同时在开头或结尾会算两次,所以答案加上最大值在开头且最小值在结尾的子区间数量 + 最大值在开头且最小值在结尾的子区间数量。

字符序列(subseq)

期望得分:20,实际得分:20

首先不是普通的字符串肯定必有蹊跷,然后就发现了题解中 Ti=Ti+1+ci+Ti+1 的公式(但有略微不同)。然后根据字符串拼接的性质,旧字符串的每个字串肯定会跟新添加的字符串组合起来变成新的字串。这不就是典型 DP,但是不知道状态怎么设计啊(况且这题还要矩阵乘法)。然后直接暴力,首先枚举出 sn,然后暴力搜索字串,拼接起来用一个 map 统计,没统计过的答案 +1,记得取模。

这道题需要把 DP 的思维转换成矩阵乘法的思维,要把每一种字符对应一种转移矩阵。这种转换题我还是接触的太少了,听完讲解后要举一反三,多做一些类似的题,好继续巩固这方面的弱点。

网络攻防(attack)

期望得分:0,实际得分:0

嗯?k 非常小,直接暴力跑他减(Tarjan),但是 Tarjan 去年学的,只能凭记忆力来回忆,回忆不上来。然后就想到了枚举炸哪条边,然后枚举任一点对,暴力遍历是否可以通达,时间复杂度 Θ(mkn(n+m)),可以获得 5 分的好成绩。那么,输出随机数。

这一题的正解看不懂,只能回去学一下随机类的这种奇怪算法。这道题输出 0 可以得 10 分,我居然没想到。

20241013 YLOI-R13

一般图最小匹配(match)

期望得分:[75,100],实际得分:75

考试时第一眼是图,就干全场唯一不是图的 T2,后来打完 T2 来回来干 T1。首先,这道题一定是要脱离图的思维的。这道题可以转换为:给定一个数组 A,求出最小的 k=1m|AiAj|1i,jn),且 i,j 只出现过一次。有了这个转换,就简单多了。

想来想去,还是想不出来,然后就想出了一个不靠谱的暴力。枚举 m 条边,然后每次选出边权最小的两条边,然后把边权加起来,时间复杂度 O(mn2)。但是,这就没必要。然后就想出了一个假的贪心:先把每个边权的值处理出来,然后都存到一个二维数组里面,最后选出最小的 m 个即可。但是,这无法满足 i,j 只出现过一次的要求。所以,在计算边权时需要用 struct 把边权和下表 i,j 存到一起,然后统计答案时用 bool 数组去重。可是,这样子的空间复杂度换算成 MB 为 50002×(4+4+4)÷10242=286.1 MB,成功 MLE。然后,我就想到了下标 i,j 可以用 short 来存啊!毕竟 n5000。所以,大小成功变为 50002×(4+2+2)÷10242=190.7 MB。空间解决了,来算算时间。枚举边权 Θ(n2),排序 Θ(n2logn),总共 O(n2+n2logn)=Θ(n2logn),运算级在 4×108 以下,可以卡过。但是当我查看评测结果时,却 TLE 了。后面在 Linux 上面 986 ms 极限卡过,但是 WA 了!

这道题的 DP 很好想,可以把 fi,j 表示前 i 个元素中,选取 j 对的最小值,转移方程非常好想。想这种 DP 题,我总是想成贪心,就非常的离谱。

重定向(redirect)

期望得分:55,实际得分:50。特判 TLE 了?

一开始看到题目毫无思路,就去看大样例,然后发现大样例的每个答案都是删除第一个 0 前面的第一个数。但是,如果按这种结论的话那么会被某些毒瘤数据 hack 掉,比如说 1,2,3,0,4,54188,。但我可以可以用一个 vis 数组来判断第一个 0 之前的数,然后看是不是都比第一个 0 前面的第一个数小。如果不是,那就可以删,那如果不是?然后想来想去还是没有想出来,然后就开始打暴力。

暴力的思路就是枚举删除哪个数,然后用贪心的思想往里面填数,也就是从最小的没填过的数开始往 0 上面填一直填到把 0 全部填完。然后用两个 O(n) 的数组来实现对比字典序即可。具体的,把数组 1 存答案,数组 2 来存每次填数后的数组,每次填完对比两个数组,如果数组 2 的字典序小于数组 1,就把数组 2 赋值给数组 1。打完这 Θ(n2) 的暴力之后,感觉还不满足,就思考特殊性质。

什么?全部都不是 0,这也太简单了。直接枚举每一个数,如果当前数比后一个数大,就直接删除这个数(可进行自证)。但是,因为我每组数据开始都把暴力的数组初始化了,导致时间复杂度退化了,直接 TLE,5550

这道题的贪心我觉得比较难想,但是 tj 写的感觉就是很简单的那种。我觉得我的贪心能力比较差,以后还得加强。

斯坦纳树(tree)

期望得分:0,实际得分:10

一开始想的是暴力建图,暴力跑每两个点的 LCA,然后在暴力搞一遍斯坦纳树,最后判断。但是这样的时间复杂度为 O(n(nlogn+2n(n+m)+nα(n)),直接炸掉。然后就是全部输出 1,居然还骗了 10 分。

这道题要用虚点来做,对于虚点,我还是不太会,回去学学虚点。

直径(diameter)

期望得分:0,实际得分:15

缝合怪 DP,直接删除 1,数据太水骗了 15 分。

20241014 YLOI-R14

通配符(char)

期望得分:0,实际得分:0

直接开幕雷击,去思考 T3 了。感觉这个题目非常不清晰,然后思考了暴力思路:枚举每个字串,然后查找 m 个文件名,但是怎么把通配符填好呢?不知道,然后看到了 s 没有 * 的部分分,但是暴力时间复杂度是 Θ(n2) 的,直接挂掉。

这道题的正解为 dp+前缀和,对我这样的字符串 dp 还是没有掌握好。

树(tree)

期望得分:50,实际得分:0

直接打 LCA 的 50 分的错误暴力,不知道为什么挂了。首先预处理 LCA,然后枚举删除哪条边,然后枚举两个点 (i,j),如果满足 i 是黑色,j 是白色,就倍增求出路径上的 max 值,就是按照 LCA 的倍增求法,一遍 LCA 一遍取 max。因为 i,j 的简单路径一定是先上到 LCA 再下来的。时间复习杂度 Θ(n3logn),不知道为什么挂了。

这道题我没有想到正解真的很不应该,连预处理都没有想到,真的是太可惜了。

木棍(wooden)

期望得分:40,实际得分:40

像这种题目,一定是组合数学+找规律。首先,我是尝试打了一个 O(n3) 的暴力来找规律。枚举另外选择的三个木棍的长度 i,j,k,然后判断加上 x 的任意三个木棍是否可以组成三角形,如果是答案 +1。打完暴力后,我就开始枚举输入 x 来找规律,然后得到输出序列 1,19,81,。首先我是发现了一个假规律,后来,我又把每个 x 可以选的和满足要求的全部打出来,发现可以选的就是 C33n,只需要求出不满足要求的即可。但是,后面还是想不出来,把暴力交上去了。

这道题不满足要求的很简单求,就是真的没有想到这道题组合。对于数学没有学好比较不友好,所以我还是得加强一下我的数学推理能力。

群星(stars)

期望得分:0,实际得分:10

啊,又考期望,而且放在第四题?我只会简单的期望。最后直接骗的大样例,成功获得 10 分的好成绩。

tj 的算法感觉根本看不懂。

20241016 YLOI-R15

最终测试(test)

期望得分:0,实际得分:0

第一眼看到 T1 放期望,感觉完蛋了,我也不会这种啊。然后,就是直接想暴力。暴力的话可以判断每个人的 4 种分数,然后枚举每个人的分数,最后判断排名,每个人算上期望。时间复杂度 Θ(4nn+),在 n14 时直接炸掉。然后感觉还没有 T3 搞得多,就去搞 T3。

这道题首先要把期望拆开,把每个人拆成 4 种,然后再算贡献。像这种题我已经接触较多了,但是对于这种期望题,我还是有待加强。

跳跃空间(jump)

期望得分:[10,20],实际得分:0。数据出锅了?

数据居然把 10 分的 l 偷偷改成了 1000,导致我唯一的希望没掉了。

这道题感觉有点像 IDDFS,但是 ni 范围很大,直接寄掉。首先就看到了 d=1l=1500 的部分分,这样的话可以简单讨论:如果是正数,就可以先 2 倍倍增到 ni,然后再慢慢 1,直到 =ni。如果是负数,那么直接一直 1。为什么可以一直 1?因为题目规定 min(|n|,|nd|)l 才行,但是 l=1500,最大的也才 |10001|=1001,所以可行。但是数据很毒瘤,直接把 l 改掉了。后来又打了 Dfs,直接暴力枚举三种,然后如果 =n 了,直接输出。但是这样最多坚持到 20>20 的还要看运气。

这道题可以运用冰山理论,通过逆向思维把 1n 变为 n1。想这样的逆向思维我还是不叫缺少,要加强。

快速访问(visit)

期望得分:40,实际得分:40

一看这道题,直接暴力好吧。首先预处理 LCA,然后这里的根节点是 0,且他的父亲节点要设为 n+1,1,inf 等等值,且在预处理要特判,我就在这里卡了好久。然后枚举每个点 i,枚举 j 的范围,集合 Si={jZ | max(1,ik)j<i}{0} 的意思就是每个 max(1,ik)j<ij 还有 0。然后就可以 Θ(logn) 算距离:Dis(x,y)=disx+disy2disLCA(x,y)。然后开个平方就可以了。

树链剖分?听不懂,接触过模板。

门童(doorman)

伟大哲学家霍尔兹基·高德再现!

When there is a probability of 34 disappearing from Niu Niu's sofa, We have 0=75。——Holzky Gould (Eng)

当牛牛的沙发有 34 的概率消失时,我们有 0=75。——霍尔兹基·高德 [英]

期望得分:[0,5],实际得分:75。骗分传奇。

让我们有请赌神发言:

人生,是一场赌。OI,也是一场赌。别人赌枪里没有子弹,我赌牛牛没有沙发。当牛牛没有沙发时,他会一直站在门口,在接待选手的同时会给我们带来 75 分的贡献。只不过,在人生中只有 1104 的概率会赌对,在 OI 中会有 34 的概率会赌对。所以,请大家勇敢一点,相信自己,也要相信出题人造数据的脚!

考试时看到这道题目,感觉是超级贪心,然后就考虑了暴力。暴力 DP 感觉想到,Dfs 吧有太复杂了。最后就赌牛牛没有沙发,一直站在门口,就输出了 (i=1nfipi)maxi=1nti

这道题要用到 DP + 李超线段树,不会啊。

20241017 YLOI-R16

语言(language)

期望得分:100,实际得分:0

漏情况了啊!

一开始直接做 T2,根本没做。后来想完 T2 回来看,感觉像上了厕所似的,茅塞顿开。然后最开始想的时候就出现了错误,以为任意 NA 的排列都可以组成 NP,然后就寄掉了。因为题目只允许 A+NP 的句子,所以 A 绝对不能再在 NP 的末尾,所以就漏了情况。然后根据这个错误的结论,我又推出了部分条件:

  • 当整个句子里出现了超过一个的 4(也就是只有 V 能调配),No。
  • 当整个句子都没有出现一个能调配成 V 的,No。
  • 当整个句子只有 4 时,No。

当然,这个肯定不是完全的。后来,又想到了如果句子中间没有一个能调配成 V 的,或者开头或结尾有 4,No。然后漏了情况,大样例不过,红温,最后直接坠机。

还没走出雅礼校门口,我就想到正解了,瞬间感觉我太弱智了。我们可以直接枚举那些字母可以配成 V,因为句子是有 NP1+V+NP2,所以 V 是关键的分界点。如果 V 的左边右边还有 4,No。如果 NP1NP2 的末尾是只能配成 A2,No。再一个,前面说了,当整个句子里出现了超过一个的 4,No。

就这么完了。

色球(ball)

期望得分:[50,80],实际得分:30

栈爆了!

考试的时候看到这是一个操作题,一看感觉平衡树啊…… 然后打没脑子的暴力(后面改了),就是暴力操作,每次放一个一个删,一个一个放,一个一个变。但是删的个数和放的个数全部 109,直接寄掉。后面看到每次放的时候为相同颜色的,只是个数不同。所以就把每个放的颜色看成一个整体,在栈里面加一个 pair,用 (x,z) 来表示颜色为 x 的现在有 z 个。所以就可以这样操作:

  • 对于操作 1,直接把 (x,z) 放进栈。时间复杂度 O(1)
  • 对于操作 2,如果现在的 z 小于等于还要取出的个数,直接取。否则先取,在放进去 (x, z)。这里实现出了点问题,栈爆了。时间复杂度 O(1)O(|s|),在 x 足够平均的情况下可以趋近于 O(1)
  • 对于操作 3,直接暴力转移。时间复杂度 O(|s|)

这道题有两种解法,第一种是平衡树,比较复杂,第二种是链表。对于这种用数据结构来维护操作的题,我还是比较不懂,我的数据结构还不算太好。

斐波(fipo)

期望得分:10,实际得分:10

暴力启动:

  • 对于操作 1,直接暴力修改 av=p。时间复杂度 O(1)
  • 对于操作 2,枚举区间 [i,j],然后搜索区间集合 S 中的每个集合 T,暴力搜索算出 TS(fibT)2 就可以了。时间复杂度 O(n22n)

正解是生成函数,也就是 g 函数,还要加上线段树维护,太难了。

偶数(even)

期望得分:0,实际得分:0

包不会的,乱搞。

20241020 YLOI-R17

袜子分配(socks)

因为纪念时隔 17 天后再次 \color{green}\text{AC} 题目,本题总结用故事记录。


小 M 是一名普普通通的 OIer。

去年他因为某些原因,被入选了南湖省的四大名校鸭梨来做 OI 集训。他集训的很成功,在去年的 CSP-J 中得了 205 分。

今年 6 月,枙子花开,当时正是小 M 小学毕业的时候,因为他有鸭梨集训的特权,鸭梨中学开放了一个后门。集训的 OIer 可以报名南湖省的歪果语中学的提前批,然后鸭梨的教练来捞人。但是,天大的遗憾砸在了小 M 身上:“啊啊啊啊,我忘记报名了!”。所以,他今年必须拿到 CSP-S 的高分才能转到鸭梨附中——中鸭培粹学校。

从今年的 926 日,他就在鸭梨中学参加 CSP-S 集训。只不过,在集训的第一天,就考了博弈论,让他大受打击。经过 10 天的拔高之后,终于有一场比赛难度降低了。”T1 答案是……是 mn1,T4 是……是最小生成树 + LCA 板子,两题 AC ,牛!”。但是,他把 T4 的 LCA 的 logn 看成了 60,导致 MLE,只有 75 分。“没事哒,失去 25 分也没什么……”。

于是,放完国庆 2 天短假之后,他抱着十二分的信心来到了集训,准备做一个新的开始。”哇哇哇,T1 几何弱智题,公式太简单啦!” 小 M 太开心了。可是,下半场的第一天他就受到了打击。”啊啊啊,我的 T1 开了变量名 y1 ,真的栓 Q。” 小 M 很失望。然后,小 M 回家被骂了一顿。然后,连续两天他都没有在 AC 题目。三天后,它终于看见了希望:”第一题 C++ 语法题吧,怎么简单。” 可是,他的希望再次磨灭。考试时 小 M 写完代码后看到大样例写的 exchange1.in,就以为 ex 是大样例的意思,然后就建了名为 change 的文件夹,名为 change 的程序……然后当他抱有希望的的提交吃完饭回来后,看到评测机上面的题目名是 exchange 就崩溃了,然后就是 1000。然后,显而易见他又被骂了一顿。而且,那一天是他爸爸的生日,所以他收到了更严重的打击。小 M 接近崩溃了,他不理解自己为什么很倒霉,他也只能安慰自己集训倒霉是为了兑换比赛时的幸运了……

在接下来的 11 天里,小 M 失去了信心。每一场基本都考得不怎么样,也只有唯一两场稍微上了一点。而在距离小 M 上次 AC 的第 17 天,却发生了奇迹。

这天早上,小 M 抱着沉闷的心情来迎接新的一周集训。他坐上了地铁,脑袋里只想着考好的情景,”那该多好哇!” 小 M 感叹着。今天的地铁显得格外的慢,以至于小 M 迟到了。他小跑着进入教室,坐上了他已经坐了 33 天(真实数据)的坐位,他打开了题面 pdf,怀着失落的心打开第一题。“啊?第一题又考期望值,我真的 AnmS!(阿米诺斯)” 小 M 已经对期望产生了恐惧。”哎,打个 30 分的 n10 暴力吧。” 他一边打着,一边想着回家后被第 12 次被骂(真实数据)的场景。”枚举每一堆袜子是哪几个,然后再检查开心值……” 小 M 默念着。”小样例过了,大样例 n=50,测不了。” 小 M 小小开心了一点。”哎,怎么 n=7 的时侯就 TLE 了?” 小 M 很疑惑。原来,他的 Dfs 的时间复杂度为 Θ(4nn2n),直接爆掉。”啊,怎么办,我连 30 分都不到了。” 小 M 急了。后来,他又想到一个优化:“哎,那我一个一个枚举袜子,然后在每一对中的第二个加上限制不就可以了?” 小 M 放下了心。”不是吧,n=7 的时侯还是 TLE 了?” 小 M 算了算,时间复杂度为 Θ(22nn2n)。”这不就相当于没优化吗?” 小 M 更急了。”哦,我写错了啊,就说嘛,答案感觉都很离谱。” 小 M 放下了心。然后他重新写了一遍对的,时间是 Θ(22nn2n2n) 的。”啊?” 小 M 感觉自己要完蛋了,心情跌落到了极点。”哎,找找规律吧。” 然后,小 M 发现每个答案都是可以表示为 pq 的,且可以化简。”这很不错哦!“ 小 M 高兴起来了。然后,小 M 得到了答案序列 11,23,35,47,59。”哇!哇!哇!这不就是 n2n1 吗!哇!” 小 M 恨不得从座位上蹦起来。他写完了代码以后,非常仔细的检查了精度,文件名,freopen。”全部正确!而且大样例 AC 喽!” 小 M 欢快的不得了。他心中的希望之光再次点亮,恢复了最初的信心。“这……这次终……终于 AC T1 了!” 小 M 愉快的欢呼。中午,小 M 吃完饭。来看评测结果,”0 分?哦哦,SPJ 出错了。” 这一下可把小 M 吓的不轻,如果他没有那 100 分的话,他会接近垫底,到时候又会被骂。

最终,小 M 第一题如愿拿了 100 分,也重新开启了狂飙 CSP-S 的信心。这里,让我们祝福:

\Huge\color{blue} \text{小 M 和所有 OIer CSP-JS RP ++!}

艰难睡眠(sleep)

期望得分:[0,20],实际得分:0

欸不是,怎么没有 1 的数据!

第一眼看到这道题,感觉是一个典型的贪心,但是后面就掐掉了这个想法。看完 T3 回来后,看一看,感觉不可做啊。哦哦,牛牛一睡就要睡 k 分钟。那么,所有吵闹的人必须空出一个恰好为 k 分钟的时间段才能最优。不会,超级暴力。首先枚举每个人吵闹开始的时候,然后每个人分别枚举,最后看一下是不是能空出来。时间复杂度 Θ(mn+1),连最小的 n,m10 都过不了。最后直接输出 1,然后没有 1 的数据。

赛后听讲解,我是弱智,暴力明明可以枚举空出来的时间的,然后贪心来变换开始的时间,可以过 n,m10040 分。这道题可以用 ST 表和线段树做,理解之后感觉比植物采购还简单。不就是把暴力的贪心挑选转换成 RMQ 问题,然后 ST 表查询吗。总结一句,还是太弱智了。

路径难题(path)

期望得分:20,实际得分:0。Floyd 写挂了!

我对这种把多种出行方式粘合起来的题的第一印象就是比较复杂,有公交有出租的。第一眼感觉有点像建虚边,但是不会建。然后看看数据范围,呦吼,这 k=0 的有 20 分,而且 n20,直接可以跑 Floyd。也就是说,把距离预处理,最后按照公式算就可以了。可是,出现了一大堆问题:首先,fi,i=0 没有初始化;其次,重边时要取边的 min 值。后来还测了手造数据,过掉了,看来我还是不能即时发现错误。

不是,这道题不就是建虚边吗,我居然还不会建,看来遇到这种题得加深一下印象了。这道题还需要注意精度问题,也是考察选手的一部分。

牛半仙的妹子序列(sequence)

期望得分:0,实际得分:0

一开始想写 Θ(nn) 的暴力 Dfs,可是没有部分分,感觉 n200 的是给枚举三个条件的。输出大样例,喜获 0 分。

这道题就是一道极长上升子序列,直接 Θ(n2) DP 可以拿 40 分。对于转换问题,我还是有待加强。

20241021 YLOI-R18

串串串(string)

期望得分:100,实际得分:100

芜湖!连续 AC!

一开始看到这道题,一看 1q2×105,一定是个 Θ(1) 查询结论题。嗯?这道题为什么要 mod 2 呢,有猫腻。然后没想出来,先去看 T3。T3 搞完期望 50 分后,回来随手看一下。可能我自认为我的眼睛直径有 2128 厘米,就开始放大瞳孔瞪小样例。然后仅仅花了一分钟,我就看出来一个当时自认为是假的结论:答案就为 s 区间中 1 的个数减去 t 区间中 1 的个数,然后取模。然后当时只是抱着玩的心态测了大样例,因为我当时觉得答案肯定没这么简单。当我打开输出文件的那一刻:AC?啊?啊!就这么水灵灵的猜对了?!然后瞪样例一分钟 + 写代码五分钟 + 测样例一分钟,共耗时 7 分钟,成功 AC T1。

如果想要知道为什么是这样子,就要这个结论:当区间内的所有 01 随意交换后,答案在 mod 2 的情况下始终相等。有了这个结论,答案直接出来。

方格计数(count)

期望得分:0,实际得分:0

看到数据范围怎么小,感觉是个 DP。推柿子吧?推不出啊,尝试过了很多了。

看完题解感觉我是弱智。这道题可以枚举线段的两个端点 a,b,而里面可以选择的点的个数有 gcd(a,b) 个,方案数为 Cgcd(a,b)+12k(N3)(k1)N2。然后发现,只要是 a,b 形态相同,答案都是一样的,所以最后乘上 (Wa+1)(Hb+1)

树数树(tree)

期望得分:50,实际得分:40

递归栈爆了!

哦,这道题给了 3 个特殊性质,还给了 40 分,太良心了。可以分类讨论一下暴力:

  • 特殊性质 一条链。可以之间从根节点一路往儿子方向划下去,满足 ai1ai 祖先,输出 n 即可。
  • 特殊性质 B :菊花图,也就是 1 连着所有点。由于树的深度只有 2,可以从一个儿子节点上到 1,在下到另一个儿子,输出 3 即可。但是这里注意,当 n=2 是的菊花图只能输出 2,因为没有其他儿子节点。不过,他不就是一条链吗,所以可以放在特殊性质 A 里。
  • 特殊性质 输出 n 即可,不知道怎么证明。
  • n10:枚举序列长度,搜索序列,最后写个 LCA 或暴力判断祖先,时间复杂度 O(),但我栈爆炸了。

正解是启发式合并,接触的少,所以没什么印象。

序列(seq)

期望得分:0,实际得分:0

不会,输出大样例。老师说这题原来又重新出了个简化版,但是没更新。这道题 n=1 时输出 05 分,我是弱智。

20241023 YLOI-R19

GCD(gcd)

期望得分:100,实际得分:100

超级简单的小题题。

我们通过打表,可以发现如下规律:

  • i 可以表示为 ab (b1)a 为质数,那么 f(i)=a
  • 否则,f(i)=1

所以,我们可以先写一个 Θ(nloglogn) 及以下的质数筛,然后枚举 [1,b]。如果当前 i 为质数,把所有的 ix 全部筛掉,答案加上。如果 i 不是质数,那么答案 +1。记得把 ia 的答案全部减回去。那为什么要从 1 开始枚举?比如说区间为 [8,13],那么遍历不到 2,3,那么 8=239=32 不会被筛掉。枚举部分时间复杂度约为 O(nloglogn)

包含(include)

期望得分:40,实际得分:40

我是弱智。

看到有二进制运算,就知道一定是根据二进制的性质来解决的,可是我是弱智,没有想到,看到有 ai1000 的数据,就大佬部分分。用 incx,y=1 来表示 x & y=y,然后每次询问来看看 i=1n[incai,x=1] 是否 1。可以枚举 [1,1000],看那些数字在数组中有,有的话就判断。

正解非常简单,只需要先把 fai 标记为 1,然后从大到小枚举每个数字,如果该数字已经被包含,则枚举删除二进制中的一个 1,删除后将其标记即可。

前缀(pre)

期望得分:20,实际得分:0

数据又双叒叕出锅了,对于 20% 的部分分,不满足 |s|10,导致搜索过不去。

不是,我居然没想到 30 分部分分?如果 t 中未包含 s 中没有的字符,直接暴力循环匹配。否则就是 1。然后我写的搜索,首先枚举前缀,然后搜字串,然后贪心匹配(如果遇到 * 肯定替换成 s 中的字符)。时间复杂度 O(n|s|i=1|s|2i|t|),是可以过 20 分的。

正解感觉挺复杂。

移动(move)

回忆起那一年,那一天,那是一块与传奇擦肩而过的牛排。

Recalling that year, that day, it was a steak that missed out on legend.

那块牛排,在 OIer 们的心中,已经成为了一个辉煌的勇士。

That steak has become a glorious warrior in the hearts of the OIers.

它在那一天中,在生产线中,不顾闸门的影响,勇敢前进,冲破了第四题最后的一道防线。

On that day, in the production line, it bravely advanced despite the influence of the gate and broke through the last line of defense of the fourth question.

牛排不顾自己被煎熟,不顾闸门的阻挡,一个人持续前进碰上了那 85% 得到最优的概率。

Despite being cooked and blocked by the floodgates, the steak continued to move forward alone and ran into the 85% chance of getting the best.

可是,那位勇士在给我们 85% 的贡献同时,他欺骗了我们,他不可能无法到达终点。那一天,那位勇士也欺骗了输出 1 的人。这种人也是它唯一欺骗了的人。甚至,它给输出 n+1 带来了 5% 的贡献。

However, while that warrior contributed 85% to us, he also deceived us, and it is impossible for him not to reach the finish line. That day, the warrior also deceived the person who output 1. This kind of person is also the only one it has deceived. Even, it contributed 5% to the output of n+1.

但是,在欺骗的同时,他却给补题带来了光明。在平常的补题中,第四题经常是无人问津,可是那天,在那位勇士的帮助下,第四题大家都可以拿 85 分。可见,那天的补题是有多么轻松。

However, while deceiving, he brought light to the supplementary questions. In regular practice, the fourth question is often ignored, but that day, with the help of that warrior, everyone can score 85 in the fourth question. It can be seen how easy it was to make up for the problem that day.

最后,让我们向这位英雄致敬!

Finally, let us pay tribute to this hero!

——Holzky Gould(霍尔兹基·高德)和翩芬祖师 on 世界 OI 哲学大会

期望得分:[0,20],实际得分:0。’

还我 1

题解中说因为闸门关门的时间之多到 109,所以牛牛是不可能不通过的。

然后如果这道题一直往前走或者等待的话是可以拿 85 分的,证明在考场上我们要相信自己的神奇代码。

20241024 YLOI-R20

纪念程序员节 + R20 大庆!

集训终结赛……

长方体(cube)

期望得分:30,实际得分:30

丸辣!第一题不会做。你要是平面我还会做,但是 3D 就有点抽象了。暴力,启动!开一个 100×100×100 的数组,然后对于每个坐标点,将覆盖到的点覆盖数 +1,最后判断是否 n1 即可。处理负数很简单,将坐标位移 50,那么就可以保证没有负数。

正解是前、后缀交,先求出所有前 i 个长方体和后 j 个长方体的交,这样每一个交都可以由一个前缀交和一个后缀交再求交得到。然后计算总交的体积,也就是被 n 个长方体覆盖的点数。然后,枚举删除那个长方体,计算前 i1 个和后面 i+1 个的交,再计算体积总和。‘

我对于这种比较抽象,特别是有 3 维的时候,就感觉思维放不出来。这种问题总是需要转换一下,锻炼思维力。

三角形(triangle)

期望得分:6030,实际得分:60

呵呵,我原来想到了 60 分解法,后来删掉了……

看到这道题,一眼三角形性质。但是感觉直接算算不出来啊,怎么可能会之间算呢?然后,就觉得这是一道结论题(然后真的是结论题),先预处理,再 Θ(1) 查询。可怎么就是想不出来,然后看 60 分,可以 Θ(qnlogn) 解决。首先,先把区间排个序,然后根据贪心思想检查相邻三个是否满足,然后这就是答案。后来,感觉这种做法假了,就打了 Θ(qn3) 的暴力,删掉了这份解法。幸好,数据很水,也成功过掉了 60 分。

这道题其实要从三角形、斐波那契等等性质来分析这道题,这里说一下我的理解。首先,从三角形的性质来看区间内有哪些情况都不能组成三角形:根据贪心的思想,排序后如果相邻三个满足 ai+ai+1>ai+2 就是能组成。所以,不能组成的话必须的满足区间内所有长度为 3 的区间不满足 ai+ai+1ai+2。那么,如果是这样的话,ai+2 就必须 ai+ai+1。按照这个思想,就算是 ai+2=ai+ai+1,也是需要满足区间是一个斐波那契数列。所以,如果区间都不能组成的话,那么这个区间排序后的增长速度是要大于等于斐波那契数列的。而斐波那契数列不超过 1018 的也就只有 6070 项。而且,题面中说了 ai 一定满足 1018。所以,如果区间长度 70,那么就一定会输出 Yes 。否则,可以进行 Θ(n) 暴力判断。时间复杂度是可以过的,最多 O(70q),最少 O(q)

对于这种从性质来分析的结论题,是要多练习的。

区间(section)

期望得分:30,实际得分:60

嗯,满足 l 单调不减,还是不会啊!如果区间不相交的话我还是会的…… 直接大暴力,然后数据太水搞了 60 分。

暴力化正解是 Splay,很显然不会。正解为双端队列,可以把区间看成一个长度为 m 的窗口,向右滑动,这样就变成了双端队列问题。

图(graph)

期望得分:[50,100],实际得分:50

考试时感觉有点像贪心,然后就想到了一个自认为是假的但是又 hack 不掉的贪心。首先给数组排个序,然后从大到小枚举,然后如果 aiaj 之间有边,就加入集合中,以此类推。最然后按照加入集合的顺序,去从最开始到最后一个枚举,答案每次加上比这个数先加进去的数且有边的数的最大值。然后不知道怎么 hack。

正解为最大生成树,感觉我是弱智,这都想不到。

posted @   beautiful_chicken233  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示