THUSC2021 游记

THUSC2021(清华大学计算机系2021年“大中衔接”研讨与教学活动) 游记

Day 0

做了好长时间的火车。

杭州好热啊,石家庄还是春天呢,杭州早就是夏天了。

(估计当地人会觉得看到了一群东北人)

不过确实是我参加的第一次全国性质的OI线下赛。

Day 1

上午测试赛,第一题简单 A + B,第二题模拟 vector,第三题模拟 list(或直接用 list)。到最后还没调出来 T3 哪里挂了 /kk

pretest 赛制,会有 fst 风险(不过看起来 sample 和 pretest 还是挺强的?至少 T2 的 sample 和 T3 的 pretest 是这样的)

下午真正的 Day1。

上来开 T1,感觉没什么思路。看到 \(n\le 50000, tl = 2.5s\),感觉应该是小常数 \(O(n^2)\) 题,可是想来想去只会 \(O(n^2 \log)\) 的暴力线段树。有点小自闭,T1 都不会。

不管了,先看 T2。尽管 T1 不会 T2 也不敢太仔细想,但是那个链的部分分的提示太明显了,这题就是要让求个树上“最长上升子序列”。考虑到 LIS 共有两种做法,我猜测它可能会考二分 DP 数组那个做法。感觉可以通过点分治之类的方法固定 LCA,然后用一个“最长上升子序列”和“最长下降子序列”拼一块。发现不用点分治,直接枚举 LCA,启发式合并即可。稍加思考后把启发式合并改成了长链剖分。这样就得到了 \(O(n \log n)\) 的可过算法。但是感觉比较难写。

口胡切了道题信心倍增,再看 T3。一眼觉得是维护 DP 数组 \(f(S)\) 表示保留 \(S\) 这些人的最优获益,逐列转移。不难发现转移的时候一个菜的贡献大致是要求所有满足 \(S\) 的子集且一定包含 \(i\)\(T\)\(f(T)\) 都加上一个值,然后直接出了个 \(O(nm + n^2 2^n)\) 的可过做法,不过又想了想觉得“一定包含 \(i\)”这个条件可以容斥掉,毕竟已经转化成了个计数问题而不是最优化问题。所以变成 \(S\) 子集加 \(S-\{i\}\) 子集减。复杂度为 \(O(nm + n 2^n)\)。(事后知道出题人的复杂度为 \(O(nm + n^2 2^n)\)

口胡切了俩题感觉比较猖狂,开开 T4 立马让我冷静下来。T4 考了个通信题???并且部分分感人,满分范围 \(n \le 70\),第一档范围 \(n \le 65\)???不过 \(n \le 65\) 的记录括号序还是很好想的,很快就想到了。看到有 \(m \le 1000\) 的部分分,感觉会不会有单次预处理比较多的东西的方法,比如用树哈希给每棵树标个号?但是考虑到枚举所有的数太难了,就放弃了。

开始写。上来把 T4 的 20 写了,没咋调就过了 20。然后写最好写的 T3 写了,调我半年/kk 怕爆 long long 开 unsigned long long,结果发现答案出现了超级大数?以为是 ull 的原因,改成 ll 以后还是有负数。最后眼调代码发现我的 FWT 又双叒叕写错了,写成了 j += (1 << i),真棒,FWT 三行代码已经出过五六种不同的错了!

T3 PP 后写 T2。觉得要写很久,结果一百行写完了。也调了一阵子,但是比预期要短。然而等待 pretest 的时候又发现个错,结果错误代码 pp 了???有点害怕。

还有一个多小时,再看眼 T1,试图想出 T1,毕竟现在就这题有拿分空间了。突然想到可以二分求下一个点,然后是个后缀前 \(k\) 小的问题了。不难想到 \(O(n\log ^3 n)\) 的做法,但是调的死去活来,出了各种错。幸亏出题人给了个强大样例,要不然我就直接当场自闭了。最后还是 PP 了。

写完前三题,感觉“人生圆满”了,觉得这回 THUSC 较往年偏简单。最后二十分钟,再看看 T4 吧,能多拿点是一点。试了试 \(n=65\) 的极限数据,发现它 T 了,发现 unsigned int128 写成了 int128,改成 unsigned int128以后还是不行,发现可能出现 int128 >> 128 的 UB 情况,改掉就能过手造数据了,结果 pretest 过了80???这 pretest 也太水了吧 /kk,但是已经一点时间没有了。

Day1 估分 320,还是挺不错的,但是这 pretest 强度有点吓人。

zzz Day1 AK 了,强强。

Day2

4h 工程题。

赛前莫名紧张。

上来看了半个小时 guide ,发现旁边已经有人开始敲了,慌得不行。看了两眼 task1,感觉和 guide 偏差有点大,就先写 task1 了。读了半天题才读懂,可是不知道怎么按字节输出。看了眼密码条,上面写着“本OJ使用标准输入输出,不需要进行任何文件操作”,但是怎么标准输入输出也不行。根本没法调试,全用黑盒藏起来了样例输出。想看两眼“样例程序”,可是一直找不着,最后过了两个小时问了监考老师才找着。我差点崩溃了。发现里面出现了 fread,于是联想到了 fprintf 和 fwrite,可是不知道 fwrite 和 fprintf 怎么写。桌面上有英文版的 cppreference,可是我一般用的是 cplusplusreference,并且这个 cppreference 没有搜索功能,不知道 fwrite 在哪里,找了半天 c++ input/output,从底部小字里发现了 fopen 的连接,才得救。时间过去了大半,可我才做出来了一道题。

task2 好像需要看 guide 了。从提供的文件中翻到了如何求射线和平面的交,以及如何判断点是否在三角形内部。然后开始手推方程,大概知道怎么写了,想翻翻有没有提供向量之类的结构体,能不能支持点乘之类的操作,结果翻到了平面的构造函数,射线和平面求交的函数,以及三角形构造函数,三角形面积函数。然后发现我其实什么都不用做,就只用调用几个函数就好了。结果一共写了五行代码,然后 segmentation fault 了,并且根本没办法调。调了一个小时以后才发现我 *NULL 了。调出来以后就只剩半个小时了,看看下一题分数有90分(50 + 40),比前两个题的总分都高,估计是没戏了。

最后拿了 60 走人了。感觉失误太大,别人应该至少人均 150 吧。不知道我为啥总是 Day2 不理想。

zzz 也只有110,出来后发现大家(HE)其实也都是 60 分。但是别的省好像好些,初二的 zjx 拿了 150,是神仙.

下午讲题。Day2是lzj出的,快骂快骂(bugan)。虽然 Day2 考得很炸,但是 Day1 还不错,还是拿到奖了。

这题比赛比起初二那次要好很多了,那次一堆失误,只拿了三等奖,这次结果要好些。

运气好而已

posted @ 2021-05-16 19:20  JiaZP  阅读(570)  评论(0编辑  收藏  举报