$\newcommand{le}{\leqslant}\newcommand{ge}{\geqslant}$

CCSP2021游记

流水账也没人爱看,就写三个小故事吧。

报名

说到CCSP, 首先要说CSP. CCSP之于CSP, 大概类似于NOI之于NOIP.

CSP,对于OIer来说它的身份大概是NOIP筹款赛所挂靠的本体。OIer朋友们都没有来报名,不过我听说清华算协有名额,反正也就一下午的事,就报名了。进场后花了两小时AK。

后来比赛部的Kay学长来找我,说有CCSP名额。不过看到CCSP添加了“系统”的竞赛方向,我还是有点犹豫的。当时我想,反正报名了,名额有限也不一定挑上我;就算挑上我了,反正今年大一,时间还比较充裕,今年不去,以后可能没时间体验了呢?于是我就报名了。

然后比赛部就通知我入围了。

文件缓存

这是CCSP2021的第四题,是一道系统优化题,其实完全是我的盲区;但是机缘巧合,它成为了我得分最轻松与最得意的一题。

要求实现一个多用户单线程文件缓存,与传统缓存相比多了一个文件大小的维度。我随手翻了翻学长给的缓存资料,决定采用LRU(最近最少使用)【后来学长告诉我这叫做LFU】的替换策略,用户不管了。怎么表示“最近”呢,我就让第 $t$ 次操作对使用次数的贡献为 $1.001^t$, 其实我不知道这 $1.001$ 有没有效果。然后我算了算:假设文件 $a, b$ 大小分别为 $s_a, s_b$, 使用频率分别为 $f_a, f_b$. 那么 $a$ 约能替换 $s_a/s_b$ 个 $b$, 如果替换,命中率上的增益估计为 $f_a-(s_a/s_b)f_b$, 也就是可以比较 $f_a/s_a$ 与 $f_b/s_b$ 的大小。按照 $f/s$ 的比较法则来做,交上去有77分。

评分还有一个维度,即缺失损失,一次缺失代价为文件大小加一常数。常数项显然是命中率的另一种说法,因此只需考虑文件大小。如果仍然按上述替换的话,节约的损失估计为 $f_as_a-(s_a/s_b)f_bs_b$, 也就是直接比较 $f_a$ 与 $f_b$ 的大小。综合二者,我随手敲了一个 $f/\sqrt{s}$ 的比较法则,交上去的时候获得了88分。这一分数到最后也仅仅衰减到了87.35, 可能是全场最好的得分了。

本题总共花了我半小时不到。

量子电路

这是CCSP2021的第三题,是一道大模拟。写题的过程贯穿了长达12小时的比赛全程。

本题要求依照题目的指引,实现简单的量子电路模拟器。巧合的是,我上次到深圳来,是到地点相近的腾讯星火计划,学了怎么设计量子电路。

中午两点之前,我实现了前两个任务,拿到了57分。中间去解决了一下第二题,接着做本题后面的两个任务。虽然做法都理解,写起来却是难点不断。

一开始对着样例调,调到吃晚饭的时候样例都过了,但是提交上去仍然颗粒无收。出去吃了个饭回来,想到可以用编译参数卡出问题来。于是本地开了-O2, 然后加了-fsanitize=undefined, 发现数组开小了。交上去还是过不去,核对一下原题发现数据范围看错了,改完多过了20分,死活调不出来就去看了剩下的第四、第五题。

封榜以后回来接着攻剩余的23分,打算写对拍。先写数据生成器,在敲下1<<n的时候,突然反应到其中n最大可达34. 于是我立即发现并更正了一个34比特整数用int存储的bug,就A了。

第二天把这个故事跟腾讯星火计划的工作人员小姐姐们讲了,她们热情地接我到腾讯滨海大厦游览。

posted @ 2021-12-16 22:42  nealchen  阅读(711)  评论(0编辑  收藏  举报