Day -1
周五早上的飞机,落地后在酒店楼下吃了铁锅炖,豪赤!休息了一会儿我去南大找我的初中同学玩,有点远,地铁做了一个多小时,运气不好还下雨了。在校园里随便逛了逛以后就去吃饭了,吃烤鱼,聊天的过程中顺便了解一下他们的课程(由于专业相近,所以还白嫖了个计算机系统基础的课程链接),羡慕南大有这么好的课程体系安排!
Day 0
早上闹钟没听到,还是被队友叫醒的。吃了早饭直接去签到,参赛服好评,然后参与游戏获得一只迷你版袋鼠。骑电瓶车逛校园,十分惬意,刚好 30 min 还车,没有多付款。然后想着有点早,去食堂可以买点奶茶,但是发现餐券有效范围过小,于是就坐下歇着,开始摆弄袋鼠。
下午热身赛,竟然要存包(好像被说了,后来负责人和保安沟通了就不用了)。获得一只大袋鼠,开赛前又是各种袋鼠摆 pos 的传统,群里图片乱飞。热身赛果然都是袋鼠题,其中三道做过,于是很快地再次复现了出来。还有两道题我们分工,然后差不多都有思路,于是上机写。但所剩时间不多(由于一开始发现题目基本做过,于是去调 bash 了,所以没剩多少时间写题),最后这两题没过,打算晚上补一下。回去路上简单瞅了题解,发现思路都是对的,所以说是口胡 AK(。
Day 1
开局良心签到,飞速通过。之后是一个象棋的简化版,想了一下发现只需要判断一步即可得到结果。然后我第一反应是直接列出所有情况,疯狂敲 if 然后 WA,冷静了一下直接循环枚举所有情况,然后又 WA,瞪了好久才发现有一个 dydydy 敲成了 dxdxdx。成罪人了 WA 了三发 1h 才过。
之后 Zlw 佬发现 F 是一个贪心加 bfs 的题,敲完一发通过。跟了一下榜发现 G,I 有一车人通过,但是想了想这两题发现我们三人都不会。佬提出我们应该多看一点题,于是开了 H,发现可做。
以下证明 SUNCHAOYI 是入机:
Zlw: 这道题我们可以先预处理出 fl,rf_{l,r}fl,r 表示这段区间内有多少个满足中间条件限制的数量。但是怎么快速处理出来呢?
Scy: 先不管前缀,枚举两个重复子串的同一侧端点,然后就可以把 border 转化成哈希判断是否相等的问题,用二分加个 log 就行。
Zlw: 哦有道理,那么相当于前缀就是等差数列的贡献,随便维护一下就好了。
Scy: 对,可以用差分代替线段树。
Zlw: 那两侧的答案怎么统计呢?好像和刚刚的过程有点像。
Scy: 前缀和就行了。
Zlw: 哎,那好像这题做完了。
Zlw: 啊呀,差分咋写来着?
Scy: 两次前缀和,阿巴阿巴阿巴!
证明完毕。prompt 正确,直接胡出来了。
然后就过样例了,差点忘记取模,然后提交!测了一万年,一发通过!
然后剩下的两个小时疯狂的在 G,I 之间徘徊,但是最后都不会,4 题遗憾离场。
讲题,发现 G 题可以将两个参数分离,于是就可以简单贪心了,懊悔怎么没想到,但是转念一想过了也 Au 不了,又感觉还好(bushi。
滚榜,竟然意外的守住银了,在正是队伍中排 80 多名,就这样吧,SUA 题真的好难!
不知道还有没有机会打 EC,感觉离退役不远了,滚回学校学 CS 去了。
【赛后补题】
G 主要就是理解合并,即让较小容量和较大流速失效。将桶分别按照容量由小到大排序,记为 AAA,再按照流速由大到小排序,记为 BBB。那么也就是最后需要保留 AAA 与 BBB 的一段同样长度的后缀。当想要再失效一组容量和流速,发现水会漏完时,情况已经不优,因此对于一组询问直接二分答案即可。
I 是一个读题细节很多的 DP,读完题后需要意识到需要从后往前 dp。因此,设 dpi,j,opa,opbdp_{i,j,opa,opb}dpi,j,opa,opb 四维表示前 iii 天剩 jjj 元,A,BA,BA,B 两人是否已经支付一次的最大价值。注意 j<0j < 0j<0 的状态直接设为非法,又由于需要从后往前,dfs 记忆化即可,代码竟然异常好写。
M 组合加 NTT 优化题,还是相当的不熟练啊,借着 AI 的理解又推了一万年。考虑 (Pi,P(i+d) mod n)(P_i,P_{(i + d) \bmod n})(Pi,P(i+d)modn) 为凸 kkk 多边形的一条边,则两线段右侧的 d−1d - 1d−1 个点失效,剩余的 n−2−(d−1)=n−d−1n - 2 - (d - 1) = n - d - 1n−2−(d−1)=n−d−1 个点需要选择 k−2k - 2k−2 个组成 kkk 凸多边形。
令 FdF_dFd 表示选距离为 ddd 的点作为一条边时的贡献,则有凸 GkG_kGk 边形的面积和的两倍 GkG_kGk 为
Gk=∑d=1n−1(n−d−1k−2)Fd=1(k−2)!∑d=1n−k+1(n−1−d)!(n−k+1−d)!Fd G_k = \sum \limits_{d = 1}^{n - 1} \binom{n - d - 1}{k - 2}F_d \\ = \frac{1}{(k - 2)!} \sum \limits_{d = 1}^{n - k + 1} \frac{(n - 1 - d)!}{(n - k + 1 - d)!} F_d Gk=d=1∑n−1(k−2n−d−1)Fd=(k−2)!1d=1∑n−k+1(n−k+1−d)!(n−1−d)!Fd
令 Ad=(n−d−1)!×f(d)A_d = (n - d - 1)! \times f(d)Ad=(n−d−1)!×f(d),Bd=1i!B_d = \frac{1}{i!}Bd=i!1,则有
Ck=∑i=1kAi×Bk−iGk=1(k−2)!Cn−k+1 C_k = \sum \limits_{i = 1}^{k} A_i \times B_{k - i}\\ G_k = \frac{1}{(k - 2)!} C_{n - k + 1} Ck=i=1∑kAi×Bk−iGk=(k−2)!1Cn−k+1
当然,还需要快速求出 FdF_dFd 的值,用叉积表示面积的两倍,则有
Fd=∑i=0n−1(xiy(i+d) mod n−yix(i+d) mod n) F_d = \sum \limits_{i = 0}^{n - 1} (x_i y_{(i + d) \bmod n} - y_i x_{(i + d) \bmod n}) Fd=i=0∑n−1(xiy(i+d)modn−yix(i+d)modn)
以 ∑i=0n−1xiy(i+d) mod n\sum \limits_{i = 0}^{n - 1} x_i y_{(i + d) \bmod n}i=0∑n−1xiy(i+d)modn 为例,先倍长数组,令 X=[x0,x1,⋯ ,xn−1,0,0,⋯ ,0]X = [x_0,x_1,\cdots,x_{n - 1},0,0,\cdots,0]X=[x0,x1,⋯,xn−1,0,0,⋯,0],Y=[y0,y1,⋯ ,yn−1,y0,y1,⋯ ,yn−1]Y = [y_0,y_1,\cdots,y_{n - 1},y_0,y_1,\cdots,y_{n - 1}]Y=[y0,y1,⋯,yn−1,y0,y1,⋯,yn−1]。再令 YrevY^{rev}Yrev 表示 YYY 的反转数组 Yrev=[yn−1,⋯ ,y1,y0,yn−1,⋯ ,y1,y0]Y^{rev} = [y_{n - 1},\cdots,y_1,y_0,y_{n - 1},\cdots,y_1,y_0]Yrev=[yn−1,⋯,y1,y0,yn−1,⋯,y1,y0]。则有
H1d=∑i=02n−1Xi×Yi+d=∑i=0n−1Xi×Yi+d=∑i=02n−1−dXi×Y2n−1−d−irev H1_d = \sum \limits_{i = 0}^{2n - 1} X_i \times Y_{i + d} \\ = \sum \limits_{i = 0}^{n - 1} X_i \times Y_{i + d}\\ = \sum \limits_{i = 0}^{2n - 1 - d} X_i \times Y^{rev}_{2n - 1 - d - i} H1d=i=0∑2n−1Xi×Yi+d=i=0∑n−1Xi×Yi+d=i=0∑2n−1−dXi×Y2n−1−d−irev
其中上限可以改变是因为倍长的时候 xn∼x2n−1x_{n} \sim x_{2n - 1}xn∼x2n−1 均为 000,而最后 HkH_kHk 也就是卷积后 C2n−d−1C_{2n - d - 1}C2n−d−1 的值。
计算另一半 H2dH2_dH2d 同理,最后 Fd=H1d−H2dF_d = H1_d - H2_dFd=H1d−H2d。
做三次完整的 NTT 即可得到答案,时间复杂度为 O(nlogn)O(n \log n)O(nlogn)。
2052

被折叠的 条评论
为什么被折叠?



