Day 1
一题给出数轴上
n
个坐标
这个式子长得太像两圆相离或外切的表示了(连数轴都告诉你了呀),于是瞬间变成取最多不重区间的水题。。。
然而我居然忘了还有右端点排序后
O(n)
的简单贪心,写了个
O(n2)
的dp加二分优化【我太咸啦】。好在总复杂度还是
O(nlogn)
不会炸(O_O)
于是20分钟拍完
当我看到二题的时候,心中突然掠过一丝欣喜——暑假讲过的原题啊(笑
但毕竟是线段树,码量略大,于是先读第三题,然后整个人都愉快了起来。(一天两道原题是要闹哪样啊?)(不过也就只有第一天2道,第二天1道是原题。而孔爷告诉我他平均一天一道原题。。。%%%ky
)
三题关键在推出二分性(当时上课的时候,这个二分性还是我志己推出来的呢),二分+数位dp, O(nlognlogn) ,也可以逐位贪心 O(nlogn) 。其实逐位贪心反而更好写,只要对从高到低依次计算“如果这一位是1,会产生多少贡献”,贪心决策取不取这一位。
然后回去写第二题。支持取膜、单点修改和求和的线段树,暴力修改,max剪枝,不打tag, O(nlognlogn) 。因为不打tag,比普通区间线段树还好写。
写完后离考试结束还有2个小时,就把二题三题都对拍了。一题暴力比正解还难写(最大团?)于是就没拍,反正这么水的线段覆盖也不会出什么锅,手了几个极端数据就过了。
这时还剩1个小时,于是就开始自以为是,觉得今天稳了。。。
然而也并没有很稳,不过270分对我这个菜鸡选手来说已经算是心满意足了。
原来是第三题少了个特判。其实题面中有关于某特殊情况的处理,然而被我忽视了。。。若能引起注意,我一定会想想为什么会出现这种特殊情况。。。认真读题!认真读题!认真读题!
下午fateice神犇来讲dp,晚上雅礼dy0607讲了几道AGC,算是杂题选讲吧。。还是挺有意思的,学了点套路。
Day 2
这曾是我离AK最近的一天
一题带权并查集秒了。考完后听他们每个人的做法真是千奇百怪,有写dp的,还有类似人脑做法的。题解竟然是dp?可是并查集多么好写好调啊。dp状态的定义需要些技巧,否则会变得超级码农。
二题思路来的也比较快。只要把spfa或dijkstra中的松弛操作变一下即可。
然后到三题就卡住了。上了个厕所回来决定打限制
xi≤100
的30分暴力。
但其实我的暴力思路是错的。我以为限制100是因为100里有25个质数,可以状压记录每个质数的倍数或公倍数有多少个,然后变成一个高维前缀和或容斥解决。
写了写发现这样连暴力也做不了,于是考虑优化。我发现较大的质数是互斥的,并不会有他们的公倍数出现,这样就造成了储存与处理的巨大浪费,于是考虑用更高效的压缩方式优化。
再一想,最高效地记录一个数包含哪些质数的方式不就是它本身吗?而题目值域为500000,那不就完全可以存下了。用容斥做,每次修改和查询都是
O(x√)
的,总复杂度
O(mx√)
,应该是正解。【这种暴力没打出来结果想到了正解的剧情也太狗血了吧】
于是今天250。三题T了。。。WTF???
T_T
下午讲题时ysy抽我来讲50分做法,于是我愉快的讲了容斥做法。——“这是正解啊。那你怎么50分?”——我TM也想问啊!
回宾馆调了一晚上,发现本机跑果然也T了。可是我的复杂度绝对没有写伪。
一怒之下直接注释掉所有处理算法来运行。震惊:printf
200000个lld用了3秒钟!!!那我又有什么办法呢?
直接把原代码交到洛谷(团队题)去测。AC…
为什么只有这道题输出会出锅啊?printf
也会挂这么厉害啊?为什么明明是正解代码,测评姬和本鸡双双TLE啊?你给我个解释啊。。。
下午ysy讲数论。
- Miller-Rabin素数检验与Pollard-rho合数分解(然而很少用)
- 中国剩余定理
- 阶:使得
ax≡1(modp)
的最小正整数
x
称为
a 模 p 的阶,记为ordpa 。即 a 的幂在模p 意义下的不同取值个数。 - 原根:
ordpa=φ(p)
时,称
a
是
p 的原根。即 a 的0∼(φ(p)−1) 次幂恰好不重不漏地占满小于 p 且与p 互质的所有 φ(p) 个数。
有原根的数只有形如 1,2,4,pk,2pk ,其中 p 为奇素数,k∈N+ 。
原根个数为 φ(φ(p)) 个 - 如果
x2≡a(modp)
有解,称
a
为模
p 的二次剩余,否则称 a 为模p 的二次非剩余。
质数 p 的二次剩余与二次非剩余个数相同。
如何快速判断a 是否是 p 的二次剩余?判断ap−12≡1 - 拉格朗日定理:若
p
为质数,
f(x) 为模 p 意义下的n(n>0) 次多项式,那么 f(x) 至多有 n 个模p 不同余的根。
证明用数学归纳法:若 f(x) 有一个根 x0 ,则可分解 f(x)−f(x0)=(x−x0)g(x) ,其中 g(x) 为 n−1 次多项式。 - 莫比乌斯反演(不想抄了)
晚上讲的题还挺有意思的(好难啊)。get了一个线段树技巧:
- 对于不太兹辞
pushup
的线段树(比如维护区间凸包),要支持在线插入末尾和区间查询:自下而上地建树,当这一段填满后才暴力( O(n) )建出这一段。即左右儿子都有了而父亲还不存在时就把父亲建出来 - 如果还要支持删除末尾,就不能删除时暴力拆解,添加时暴力构建,这样如果在一个点反复横跳的话就会T。做法是填满一个块后不立即构建当前块,而是找当前层的前面一块,如果前一块没有构建,就构建前面的块,否则就什么都不干。这样查询时仍然会查到
O(logn)
个区间,并且如果要构建第
i
层的长度为
2i 的区间,至少要进行 O(2i) 次操作。 - 适用范围:
- 区间信息无法
O(logn),O(1)
快速合并, 只能做到
O(n),O(nlogn)
其实也就是不支持快速合并, 但是支持快速插入, 能不能快速删除无所谓。 - 如果维护好了区间, 查询可以快速得出 ( O(logn) )
- 区间之间互相无影响且查询信息可以快速合并 ( O(1),O(logn) )
- 对于这样的问题, 我们可以得到一个序列上支持插入删除的在线做法。
- 区间信息无法
O(logn),O(1)
快速合并, 只能做到
O(n),O(nlogn)
Day 3 - 8
留坑待填