QAQ 没有去考大视野的题目觉得非常的不开心 QAQ
然后被硬塞了一套非常水的题目
上午快结束还莫名其妙自己的电脑的电源掉了QAQ
那么就没有代码了QAQ不过都拍过问题不大QAQ
第一题
首先我们发现这是个裸的块状链表练习题
但是回想了一发发现自己不怎么会写块状链表
YY了一下觉得块内维护一个链表好像时间复杂度也是O(n*sqrt(n))
大概码了一个多小时吧,链表的边界什么的讨论起来有些麻烦
一边拍一边改掉了QAQ
具体做法是这样的:
我们考虑设S(i,k)表示前i个块k这个值出现的次数
不难发现空间复杂度是O(n*sqrt(n))的,预处理时间复杂度O(n*sqrt(n))
思考之后不难发现每次修改对于这个预处理最多只会影响2*sqrt(n)个值
我们暴力修改预处理数组就可以了
考虑查询的时候存在不完整的块,这个时候我们需要对这些块暴力
如果用平衡树维护的话时间复杂度会多个log
不难发现每次修改完整一个块的时候只会在块头加入元素和块尾删除元素
那么对每个块单独维护一个链表,不完整的块暴力重构就可以做到O(n*sqrt(n))啦
第二题
明显是要乱搞的题目
首先50分的做法显然是直接利用鸽笼原理暴力1->a
这个时候我们不难发现f(x)的增长是极其缓慢的
考试的时候我采取了这样一种做法
我们注意到如果存在区间[L,R]的值非常接近k*a
那么我们可以通过不断的移动两个端点来使得其逐渐逼近k*a
对于这个的实现我是采用的模拟退火
枚举k大概从1->10的样子,然后利用数位DP确定最接近k*a的右端点
之后模拟退火每次计算差值,如果=0就退出,差值变小一定接受移动,否则有概率接受移动
时间上肯定没有问题,正确性不会证明
拍了两个多小时没有出错QAQ
第三题
QAQ yjp丢失的题面
曾经看过那篇论文,有些点还有点印象,有些点考试的时候推了推也推了出来
首先第一个点直接输出就可以了
第二个点我们注意到长度是2^22,猜想是倍增构造,不难发现是每次倍增取反
第三个点我们注意到经常会有一段等于前一段,这样的段长分别是3,5,8,13,然后发现总长度是f(33)
即斐波那契数列第33项
第四个点看到数列长度很自然想到FFT,事实证明就是个卷积
但是模数不好确定,随意找几个点算一下答案之后CRT可以解出模数
模数是2^22*25+1
第五个点直接看就知道是多项式开根
第六个点显然是多项式开立方根
第七个点是一个图,我们发现输出只有两种:0和一个奇怪的数
然后发现询问也是只有两个点,猜想是判断两个点的关系
图两个点的关系显然是判断连不连通,然后发现联通输出0,否则输出那个奇怪的数
第八个点是个树,我们发现输出都是树上的边权,用ctrl+F查几个数就可以发现这个事情
然后询问也是两个点,猜想是两个点之间的边权信息
要么最小边权,要么最大边权,最后发现时最大边权
第九个点是个图,发现输出也是图上的边权,然后惊奇的发现输出中有第七个点的奇怪的数
询问也是两个点,然后判一下联通,发现不连通就是这个奇怪的数
考虑到第八个点,不难猜出第九个点输出的两个点的最小的最大边权
然后做一发最小生成树就可以了
第十个点直接输出就可以了QAQ