不难但是牛魔,随机数据大🐍。
A:
考虑若一个子矩形内有 x 个 1 ,然后整个矩形一共有 t 个 1 ,那么相似度为 t−xx 。
而计算一个固定的 x 一共有多少个子矩形可以做到 O(n3) ,枚举左边界,右边界之后从上到下枚举下边界,计数合法的上边界个数即可。
若相似度为整数 k,则有 t−xx=k⇒x=(1−1+k1)t,说明 (1+k)∣t。而数据随机生成,所以 t 期望有 ln(21n2) 个因数,只需枚举这些因数即可。
期望复杂度 O(n3logn),期望得分 100 分。
B:
原题,前几天的反射容斥。
C:
暴力艹过了,但是题解看不懂。
考虑每次不暴力更新,而是枚举除掉的数是 x,那么能转移到的是一个区间,可以使用线段树维护区间最大值和最大值点来维护,考虑这样做的复杂度。
由于每次枚举除掉的数肯定不超过 n/x,所以最多 ∑p(x)min{w,n/x}次线段树操作,如果把线段树的 logn 设为 100 的话,下图是两种算法的效率。
出题人试图分析了一下渐进复杂度,如下:
∑i=1np(i)n/i≤n∑i=1ni1∑jd0(⌊wji⌋)=O(n∑td0(t)∑k=1logw(n/t)∑p=wkwk(t+1)−11/p)=O(n∑td0(t)∑k=1logw(n/t)log(wktwkt(t+1)))=O(n∑td0(t)∑k=1logw(n/t)log(tt+1))=O(n∑td0(t)logw(n/t)log(1+1/t))=O(nlogwn∑i∑j=1n/ilog(1+1/ij)))
由于 log(1+1/x)=O(1/x),则
=O⎝⎛nlogwni∑1/ij=1∑n/i1/j⎠⎞⎠⎞=O(nlog3n/logw)
次线段树操作,总复杂度不超过 O(nlog4n/logw),但似乎十分不满。
D:
非常好啊,还是贺的题解。
考虑把 2SAT 图建出来,缩点,此时缩完之后每一个点有一个与之对应的点,即为 invu,这两个点的取值必须不同。
传递闭包之后,如果有 u→invu ,或 invu→u ,那么这一对点的取值就确定了,高处的那个为 0 ,低处的那个为 1 ,就可以忽略这对点了。
然后考虑在经过上述处理的图中进行暴搜。若在限制的意义下不连通 (即所有限制连边, u 与 invu 连边形成的图不连通),则答案显然是各个连通块的乘积。
否则,考虑选择某一个点 u ,枚举它是 0 还是 1。若是 0 ,那么所有 i→u 都是 0 ,所有 invu→i 都是 1 ,若是 1 则反过来。
所以说,枚举了一个点的取值之后,会多确定能由它到达,或到达它的所有点。
我们试图选择这些点个数最大的那个,然后将其去掉递归,考虑分析复杂度,我们试图用度数来限制,肯定减少的总和要大于度数。
若所有点度数 =0,则都是孤立点,连通块分解后是 O(1) 的。
若所有点度数 ≤1,则连通块大小不会超过 2 ,连通块分解后是 O(1) 的。
若所有点度数 ≤2,则是一个个链和环,如果我们随机选择一个最大的点确定,则期望会被切分成两半,那么这么递归是 O(poly(n)) 的。
所以说,所有点度数至少是 3 ,也就是说复杂度是:
T(n)=poly(n)+max{T(n−1)+T(n−4),T(n−2)+T(n−3)}=O(1.3803n)
实际上,由于去掉了一些点导致其它点的度数进一步降低,加上随机化的部分,这个算法很难卡满,数据使用了一个每个点度数都为 3 的二分图以及一些类似的结构,大概能卡到 2×107 次左右的递归。
如果没有随机化,则链和环的情况无法处理,这样的复杂度是:
T(n)=poly(n)+max{T(n−1)+T(n−3),2T(n−2)}=O(1.415n)
可能无法通过 n≤60 。