CCC2019游记

好吧其实是清华游记,$CCC2019$ 在中国只有北京和天津举办,要选去加拿大的人很少,估计是最近两国关系有点紧张的缘故吧

但实际上是某些已经被清华钦点的人去预览一下他们未来的栖息所


$13:30$ 到了清华(门口的保安都好高端啊,手臂上都有“清华门警”标志),发现清华计算机系大楼里的通道都挺神秘的,两边的研究房(其实跟学生的办公室差不多)也好高级……我只记得第一个好像叫“下一代互联网研究中心”,别的记不清了。

先去楼上听了不知道哪个清华老师的诈骗招生讲解。

老师的讲解也比较温和催眠(全场大部分听着听着就睡着了),列举了一下清华在计算机系的各个成就以及世界排行,包括 $AI$、系统等方面。名次你知道的

列举了很多排名,讲讲清华招生政策,并且鼓励在场的几十个同学早日来到清华研究学习

其实老师完全可以不用吹那么多,或者不说,全场都会自动被诈骗去清华的(说的不错,tm考得上吗)

吹完了,下楼去听另一个老师讲讲 $IPV6$ 相关的知识。

虽然 $IPV6$ 有 $2^{128}$ 个地址($2^{64}$ 已经是个天文数字了),而且 $IPV6$ 不分公网私网,但目前 $IPV6$ 在国内没有普及,重要原因貌似就是 $IPV4$ 和 $IPV6$ 不兼容,也就是 $IPV4$ 地址的网站不能转用 $IPV6$ 打开,目前还在抓紧研究两种地址间的翻译技术(当然还有其它原因)。


然后就早早地去 $CCC2019$ 考场了。那个机房是一个不知道该怎么形容的弧状,反正就是清华风格吧。

听说加拿大出的题很有 $CF$ 风格?不管,反正我要浪到考试。(考后我才知道根本不是加拿大的题,是清华的人自己出的选拔题,$T2$ 和 $T4$ 甚至是我们大哥出的)

然后到考前 $10$ 分钟的时候我发现我忘了 $linux$ 的终端命令怎么写了(谁闲的蛋疼天天用 $linux$),那里的 $linux$ 里没装 $guide$ 之类的可以直接编译、运行程序的编程软件,只给了类似于 $visualspace studiospace code$ 之类的文本编辑工具。

然后发现清华大哥在旁边,我就询问了一波……

(大哥:你真该挨板子啊,基础操作都忘了)

不过只能终端编译、运行程序还是不太习惯。

$16:00$ 上清华内网打开题,全是英文,都没人志愿翻译一下的,$tzsl$。

$T1$ 题意:给你一个字符串,让你输出 删掉字符串中所有出现次数小于 $k$ 的字符后的字符串。

模拟题(woc这种题就不应该开终端编译的)

果然是 $CF$ 风格?前面的题很水?

$T2$ 的英文 $non-negative$ 我忘了什么意思,猜了半天,猜想是无符号(就是非负)。

题意:给你一个二进制完全平方数,输出其开平方根后的二进制数。$90\%$ 的数据二进制数长度 $|n|le 3000$,$100\%$ 的数据 $|n|le 100000$。

首先能想到二进制转十进制,直接开 $int$ 数的平方,然而这样貌似只能拿 $30\%$ 的分。

然后又看了一下满分数据,$1e5$ 的数据,想了想,按照 $CF$ 风格,这题应该就是到智力题吧?

然后推了半个小时弱智结论,写了一发,并不对,白忙活了。

只好回头考虑 $90$ 分

二分答案?然而高精度二分不是很蠢吗……复杂度大概是 $O(|n|^3)$ 的样子(没仔细思考),$60\%$ 的分。

其实不难发现 高精度二分只要从高到低枚举每一位是 $1$ 还是 $0$ 即可,二进制基础知识。

对于枚举的一个二进制位,如果设其为 $1$ 后比给定的数大,就把这位设为 $0$,否则设为 $1$。

把一个二进制数修改一位后再求其平方,朴素暴力的时间复杂度是 $O(|n|^2)$ 的,套外面的枚举 $|n|$ 个二进制位,复杂度 $O(|n|^3)$。

仔细思考一下,把这个数的平方列成乘法竖式,自己乘自己,其实可以在之前的平方结果的基础上 $O(|n|)$ 修改,得到新的平方结果。总时间复杂度 $O(|n|^2)$。

所以养眼+养生磨蹭了不少时间才写完 $90$ 分。滚去看 $T3$ 了。

$T3$ 题意:给你一个环,长度 $nle 262144$,环上依次排列 $n$ 个数,每次可以把相邻的两个相同的数合并成一个新数(第 $n$ 个数和第 $1$ 个数相邻),新数的值为合并前的任意一个数 $+1$。所有数的值 $le 40$。让你设计合并方案,使最后环上的最大数最大(“最后”指环上没有能合并的相邻两数 或者环上只剩一个数)。

考试的时候看到数据范围以为是个贪心(比较菜),于是写了个优先队列合并区间……

然后调试的时候(大概 $18$ 点整左右),我和旁边几人的电脑突然断电了……$tzsl$

监考员(大学生)去重开电闸后,有两个人的电脑重启了两次后就打开了,然而我和另外一人的电脑就崩坏了……

算算也浪费 $5$ 到 $10$ 分钟了,监考员说会给我们加时,然后先让我们坐旁边电脑了。

监考员通过安全模式帮我把 $T3$ 的代码发了过来,然而我在这段时间里证明了这个做法是错的,因为并不能朴素地优先队列合并区间。

比如一个环上有 $1space 1space 1space 1space 2space 2$ 六个数,正确答案应该是先合并第一、二个 $1$ 或第三、四格 $1$,答案应该是 $3$,但有可能采用合并的数相同却不正确的策略,比如先合并第二、三个数,这时最大就只能弄出 $2$ 了,显然不对。

其实可以附加一些策略来修正以上问题,但是代码好像很丧心病狂,考场写出来并不太合理,于是就跳了这题。

$T4$ 题意:

有一个神奇的式子$$(sqrt{2}+sqrt{3})^n+(sqrt{2}-sqrt{3})^n+(-sqrt{2}+sqrt{3})^n+(-sqrt{2}-sqrt{3})^n$$

这个式子中的每一项都可能不是整数,甚至不是有理数,但四项的和一定是个整数。题目并没有给出证明(就算给出证明估计也会因为不通英文而看不懂)。

不仅如此,其推广出来的式子也满足这个性质 $$sum{(pmsqrt{a_1} pmsqrt{a_2} pmsqrt{a_3} ... pmsqrt{a_m})^n}$$

你的任务是给你 $n,m$ 和 $a_1$ 到 $a_m$,求出上式的结果膜 $10^9+7$。

$n,a_ilt 10^9+7,space mle 7$

显然不能暴力,因为中间过程全是小数运算,而小数并不能取膜。

考试的时候没怎么想这题, 看到 $10\%$ 的数据中 $m=1$,于是直接做了 $10$ 分滚去看 $T5$ 了。

$T5$ 的英文有点硬核,我理解了半天才弄明白题意:

有一棵带权无根树,$n$ 个点从 $1$ 到 $n$ 编号。初始时有从 $1$ 到 $n$ 编号的 $n$ 个点集,第 $i$ 个集点集只有 $i$ 号点。

接下来有 $n-1$ 次操作,每次操作给你两个数 $a,b(alt blt n+i)$,然后生成一个编号为 $n+i$ 的新点集,其内容为编号为 $a,b$ 的两个点集的并。

保证编号为 $n imes 2-1$ 的点集恰好包含树上 $n$ 个点各一次。

对于生成出来的 $n-1$ 个点集,判断每个点集中是否有在原树上距离至少为 $k$ 的点集($k$ 全局不变),输出 $0$ 或 $1$。

$30\%$ 的数据中 $nle 200$, $60\%$ 的数据中 $nle 2000$, $100\%$ 的数据中 $nle 100000$。

注:点集是集合,有互异性,即点集中不会有同一个点出现两次。

从前往后扫部分分,很快想到了 $20\%$ 数据的做法。但因为考试策略不当,准备写的时候已经只剩 $5$ 分钟了……其实本来还有 $10$ 分钟左右加时,不过我出于某些考虑并没用(包括这考试没什么用,只取前 $2$ 名去加拿大参加比赛,其余人连个证书都没有),所以没写完这题。

 

算了一下,这比赛应该差不多是省选难度?然而 $3$ 小时就拿了 $200$ 分……如果用加时的话可能 $5$ 分钟大概就能写完第 $5$ 题前 $20$ 分,那也就 $220$ 分,还是菜。

出了考场后发现 两位 $GD$ 神爷一个 $390$ 一个 $400$ 吊打一群人……

据说是做过 $T3$ 原题……那神仙题我等蒟蒻都不会啊……

然后剩下的人好像也都考得并不理想,除了馒 $god$ 切了 $T5$ 拿了 $300$ 分以外,再其他人最高好像就 $200$ 分了……并不知道发挥情况

$T2$ 最后 $10$ 分是出题人(大哥)防 $AK$ 的,实际上出题人自己都没想到多项式时间的做法。有一种可能可行的方法:二分答案套 $FFT$ + 压位(那个 $FFT$ 其实就是为了快速做大乘法,也就是平方),压位要把每一位开 $longspace long$ 因为每一位要存 $30$ 个左右二进制数,复杂度大概就是 $O(frac{n imes log(n)}{30})$。注意一下不用 $NTT$,模了高精度数的其中一位还会错(你并不能在 $NTT$ 中借取模实现进位),列乘法竖式的时候先不进位,最后统一从低往高进位即可。

$T3$ 就是一个状态偏僻(想不出来)的区间 $dp$ 变形。我们知道,在区间 $dp$ 时,一般左、右端点(或左端点和区间长度)各占一维状态,但如果区间特别长(比如 $1e5$ 级别长度),这样存显然爆空间,但我们可以观察一下 $dp$ 数组存的值,如果值很小,我们可以将 $dp$ 值与 $dp$ 的一维状态交换,从而降低复杂度。这题同理,由于初始时所有数都不超过 $40$,所以即使初始时所有数都卡满 $40$,最大也只能合出来 $40+lfloor log(n_{max}) floor$,不到 $60$。

把环拆成二倍链。设 $dp(i,j)$ 表示使第 $i$ 个数变为 $j$ 时,最少要向右合并多少个数(只能向右)。转移方程大概是 $dp(i,j)=dp[i+dp(i,j-1),j-1]$(我靠有了状态后转移真好想),注意特判一下 $dp$ 值不能 $ge i+n$,这种情况下不能更新。

$T4$ 是个比较短的矩阵快速幂(但不会推式子)。简单的说个例子:看看样例,会发现式子的每一项无论求多少次幂,都可以只用 $1,sqrt{2},sqrt{3},sqrt{6}$ 这四种系数表示,所以可以以系数为横轴,$n$ 为纵轴建个矩阵,简单的话就是暴力转移,进阶一点就是矩阵快速幂。

$T5$ 考后想想其实是个傻逼题……非常结论……$WZJ$ 还讲过(我还记得)……只不过没时间思考了…… 首先前 $50$ 分都可以暴力地合并两个点集;然后 $20\%$ 的数据就是暴力两两配对两个集合中的点,看有没有距离超过 $k$ 的点,快速求两点距离的话可以写 $O(1)$ 求 $LCA$ 后求两点与 $LCA$ 的深度差,也可以直接 $O(log(n))$ 倍增求;$50\%$ 的数据,可以暴力合并出新集合后,$O(n)$ 求新集合的最长链(就是从任选的一个根节点出发求两次最远点)。

满分的话,就不能每次暴力合并两个点集了。如果不合并,又要快速求出一个点集的最远点(也就是最长链),就考虑一下能否只记一个点集的最远两点(即最长链的两端)。事实上有这么个结论,就是合并两棵树,新树只有六种最长链,即原来两棵树的两条最长链的四个端点中任选两条相连,具体证明这里不赘述了。总之记住这样一个结论,这题挺裸的……但放到第五题确实很想喷,哪怕根第二题交换一下也能接受。


考完后找这个那个理由,说没看见 $T2$ 的 $90$ 分部分分之类的话有什么用呢?$HX$ 老爷不是说了部分分要从前往后看吗?

这风雨飘摇一程究竟还有多远?

原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/ccc2019.html