UOJ Logo peehs_moorhsum的博客

博客

UOJ NOI Round #4 Day1 题解

2020-08-12 13:43:20 By peehs_moorhsum

这次的题目背景大部分是vfleaking写的。

出题人 01,02,03 只是主人公的名字,和真实出题人没有任何的关系。

序列妙妙值

from zhouyuyang,数据、标程、题解 by zhouyuyang

由于是 D1T1 ,为了让参赛的选手分数都好看一点,数据相对来说造的没有那么强。

算法1

我会暴力!

fi,j表示前i个数字,划分成了j段的最优解。

转移直接枚举新的右端点即可。

使用前缀异或和优化后时间复杂度为O(kn2)

期望得分:40

算法2

我会优化暴力!

ai较小时,则我们可以记录前缀异或和为ai的最优解。

转移时枚举上一个端点对应的前缀异或和即可。

v=maxai,则时间复杂度为O(knv)

期望得分:2040

结合算法1期望得分6080

算法3

不难发现对于算法2,我们可以实现O(1)修改最优解,O(v)查询。现在我们尝试平衡一下两部分的复杂度。

在修改时,我们枚举二进制下较高的8位,并且更新最优解。

在询问时,我们枚举二进制下较低的8位,并且利用最优解更新DP值。

不难发现,这样转移和算法2中的等价。

时间复杂度O(nkv)

期望得分:100

其他算法

考虑序列分块,块内暴力转移,块之间采用fmt的思路转移,时间复杂度O(knnlogn),当场看上去是能过的。

可以尝试只枚举xor和前256小的状态加速转移,得分不明。

可以尝试在trie树上乱搞更新答案,得分也不明。

网络恢复

from Aprilgrimoire,数据、标程、题解 by Aprilgrimoire

做法一

令所有的ai=1,依次对每条边进行询问。

询问次数:O(m)

期望得分:10

做法二

每次取出w=64个点,令它们的权值a分别为1,2,,2w1。然后打开每条边,进行询问。通过每个点的b的每个bit可以判断出它和这w个点中的哪些点有边。

询问次数:O(nw)

期望得分:30

做法三

测试点5中,保证给出的图是树。我们可以给每个点分配随机的a,打开每条边,进行询问。对于图中的叶子,它的b恰好等于和它相连的点的a。对于其它点,它的b等于某个点的a的概率是很低的,可以忽略。依次考虑所有的点,如果我们发现它是叶子,那么我们就找到了一条边。我们可以报告这条边,并且把这条边从图上删掉(将它的两个端点的b异或上对方的a),并重新考虑这条边的端点是否成为了叶子。

询问次数:1

期望得分:10

做法四

测试点6中,保证给出的图是基环树。每次随机将边分成两个集合。由于环上至少有3条边,每次至少有34的概率使环上的边没有被划分到同一个集合中,从而得到的两个集合都是森林。尝试对这两个集合使用做法三,有较高的概率可以得到解。

询问次数:O(1)

期望得分:20

做法五

每轮随机取出一些边,只考虑被取出的边。每条边在不同的轮中可以被重复取出。使用做法三的方法持续找出度为1的点,直到剩下每个点的度都至少为2。每条边有玄学的概率在至少一轮中被发现了。

虽然不知道为什么但是效果还不错。

询问次数:50

期望的分:80

做法六

将所有的边随机分成50组,只考虑某一组中的边。使用做法三的方法持续找出度为1的点,直到剩下每个点的度都至少为2。假设当前剩下的每个点的度都至少为k,我们可以找出这些点中任意(k+1)/2个的a的异或和,设为集合A。再考虑一个点的b异或上k/2个点的a,设为集合B。比较集合A与集合B,对于每个公共元素,我们就找到了将一个点的b表示为ka的异或的方法。发现一些度恰好为k的点并删除和它们相邻的边后,可能有一些点的度现在小于k了。由于剩下的点数比较少,我们可以重新把k置为1,然后依次增大k

虽然不知道为什么但是对于随机数据效果挺好的。

询问次数:50

期望得分:100

校园闲逛

from zhouyuyang,数据、标程、题解 by zhouyuyang

本题idea来自于【CTSC2016】NOIP十合一的测试点4

出题人没打算把FFT的常数卡到死,被喷卡常题,然后就被分治干过去了...

算法-1

暴力DP计算方案数即可。

时间复杂度O(nmv)

期望得分10

算法0

使用分治fft优化暴力计算的过程。

时间复杂度O(n3vlog2v)

转移时利用点值的性质可以做到O((n3+n2logv)vlogv)

期望得分20100

同样是算法0,为什么有人20,有人100...

选手卡常水平高超,实在打不过...告辞...

算法1

确定起点时可以列出关于答案的生成函数的方程组:

假设ap,i表示长度为i的到达p的路径条数,ep,q,i表示起点是p,终点是q,长度是i的边的数量。据此设Ap=ap,ixi,Ep,q=ep,q,ixi

设节点数为3,起点为1。则可以列出如下方程组。

{A1=E1,1A1+E2,1A2+E3,1A3+1A2=E1,2A1+E2,2A2+E3,2A3A3=E1,3A1+E2,3A2+E3,3A3

类似于高斯消元的思路,我们可以每次找到唯一一个常数项非0的系数进行高斯消元。由于边权不为0,因此仅有形如Ei,i的系数的常数项非0

解到最后会得到若干个Aifi=Pi的公式,由于fi常数项非0,直接Ai=Pifi1即可,其中fi1表示fi的逆元。

对于每个起点运行消元即可。

时间复杂度O(n4vlogv)

期望得分5080

算法2

观察不同起点时的矩阵,不难发现方程组本质只有最后一列的常数项上存在区别,其余各项均没有区别。

因此类比于解逆矩阵,我们可以同时解这n个方程,在消元时同时消最后的n个不同的方程即可。

时间复杂度O(n3vlogv)

期望得分60100

算法3

在维护高斯消元的系数的时候,仍然可以使用点值加速高斯消元系数的维护。

我们只需要在询问当前元素的值的时候进行一次IDFT,其余时间全部使用点值维护修改量即可。

时间复杂度O(v(n3+n2logv))

期望得分70100

由于算法3有着高达7的大常数,但是算法2常数只有1,因此算法3跑的挺慢的。

其他算法

如果利用FFT的点值,不要每次都暴力分治也可以过。复杂度可以和算法3一样。

如果在转移的时候利用转移系数加速分治过程也可以过。复杂度可以和算法3一样。

如果你分治常数足够小,应该可以卡着时间限制过去。

评论

前排支持
t2搞忘交了,哭哭哭
前排支持
前排支持
T3可以建出每种边权的邻接矩阵,然后构造矩阵为系数的生成函数,多项式求逆算无穷级数(
评论回复
StormySea:%神lst,吊打出题人
T1有什么类似的题目吗,为什么全世界都想的到
t1我trie树上乱搞更新答案只有暴力的40分/QAQ
中排资瓷
trie上搞有80
评论回复
hkxadpall:我97QwQ
T3怎么利用点值的性质优化
哦对,我看错评测结果了,我也有80/捂脸
@soaringa 你是说分治fft的解法吗?利用点值的性质应该就是指类似于整体二分,然后你把所有左边的f[u][v] dft成点值之后算对右边的贡献,那么时间复杂度就变成 O(n^2vlog^2v),了,而不是 O(n^3vlog^v) (如果我也错了就当我没说)
前排资瓷!
人与人的常数不能一概而论,我曾经再在极度愤怒的情况下跑进了 4s。
T1的kn sqrt(n log n)做法能过
T3 用点值加速高斯消元不会因为循环卷积出问题吗?
评论回复
BruceW:没事了, 看了std

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。