【杂文】NOI Online2020 Round3 划水记
今天的题依旧水得不行((...) 卡常大赛?)
这次准备按顺序做。
(T1:)
(...)
我怀疑你在侮辱我的智商,而且我有证据 (...)
(T2:)
暗示已经很明显了,把边信息存到一个 (n^2) 大小的矩阵里,直接跑矩阵快速幂即可。
具体的说,设 (v(i)=f(0,i )),矩阵 (base) 中 (a(i,j)) 表示点 (i,j) 之间是否有边,矩阵 (A(t)) 中 (a(i,j)) 表示 (f(i,t)) 异或到 (v(j)) 的次数,按照标准矩阵乘法转移即可。对于一次询问 (time),求出 (B=A(0)*base^{time}),然后对于每个 (i),把 (v(i)) 拿来异或 (B.a(1,i)) 次即为答案。
复杂度 (O(qn^3log inf)),过不去。
由于异或的良好性质,可以把矩阵中的所有值都对 (2) 进行取模,这样答案是不会变的。取模后就只有 (0) 和 (1) 了,上 (bitset) 。
复杂度 (O(frac{qn^3}{w}log inf)) 。
刚好 (10^8),有点悬,极限数据跑了 (1.34s),还需要卡下常
想了一下,把快速幂换成倍增就可以了,极限 (0.47s) 。
(T3:)
首先,选子序列可以视为选出一些排列。
先考虑 (and) 的特性,发现最终的 (sum a) 不会超过 (2^{18}=262144),于是很自然地想到预处理 (phi),然后分别计算加出每一种 (sum a) 的方案数,最后扫一遍可能的值统计答案。
一开始想的是按照顺序一个一个往后面加,用 (f(i,j)) 表示加到第 (i) 个点,目前 (sum a) 的值为 (j) 的方案数,则有 (f(i,j)=sum_{substack{{i & j=0}\{i~mid~ j=k}}} f(i-1,k)*cnt(l)),但这里的 (cnt) 极其难搞,于是作罢。
又重新 (yy) 了一下,发现第一维根本就不需要啊,直接 (f(j)=sum_{substack{{i & j=0}\{i~mid~ j=k}}} f(k)*cnt(l)),其中 (cnt(l)) 为 (1) 至 (n) 中值为 (l) 的个数。
这样的话就很简单了,对于每个 (j),直接枚举它的子集作为 (k) 进行转移即可。
复杂度 (O(3^{log inf})),最大是 (3*10^8),极限 (3.5s),于是又是一波恶心人的卡常(最难受的就是取模,慢得不行),好不容易才卡进了 (1.7s),突然意识到自己造的随机数据有大量空状态,常数小是必然的.....
懒得想其他做法了,把一切都交给 ( ext{CCF}) 的老爷机吧...
(updata:) 经 ( ext{Owen_codeisqueen}) 聚佬指点,用 ( ext{[WC2018]}) 州区划分 类似的做法可以优化到 (O(2^{log}log^2)) 。
期望得分: (100+100+100) 。
民间数据:(100+100+10) 。
哎... (T3) 写挂了... (f(0)) 应该初始化为 (2^{cnt(0)}) 的,不知道为啥我写了个 (cnt(0)+1) ...而且对拍也莫名其妙地没有拍出来...自闭...
实际得分:(100+100+10) 。
嘛..不管怎么说,至少比第二场要好些了...