2024.10.14总结


不难但是牛魔,随机数据大🐍。

A:

考虑若一个子矩形内有 xx 个 1 ,然后整个矩形一共有 tt 个 1 ,那么相似度为 xtx\frac{x}{t-x}

而计算一个固定的 xx 一共有多少个子矩形可以做到 O(n3)O\left(n^{3}\right) ,枚举左边界,右边界之后从上到下枚举下边界,计数合法的上边界个数即可。

若相似度为整数 kk,则有 xtx=kx=(111+k)t\frac{x}{t-x}=k \Rightarrow x=\left(1-\frac{1}{1+k}\right) t,说明 (1+k)t(1+k) \mid t。而数据随机生成,所以 tt 期望有 ln(12n2)\ln \left(\frac{1}{2} n^{2}\right) 个因数,只需枚举这些因数即可。

期望复杂度 O(n3logn)O\left(n^{3} \log n\right),期望得分 100 分。

B:

原题,前几天的反射容斥。

C:

暴力艹过了,但是题解看不懂。

考虑每次不暴力更新,而是枚举除掉的数是 xx,那么能转移到的是一个区间,可以使用线段树维护区间最大值和最大值点来维护,考虑这样做的复杂度。

由于每次枚举除掉的数肯定不超过 n/xn / x,所以最多 p(x)min{w,n/x}\sum p(x) \min \{w, n / x\}次线段树操作,如果把线段树的 logn\log n 设为 100 的话,下图是两种算法的效率。

出题人试图分析了一下渐进复杂度,如下:

i=1np(i)n/ini=1n1ijd0(iwj)=O(ntd0(t)k=1logw(n/t)p=wkwk(t+1)11/p)=O(ntd0(t)k=1logw(n/t)log(wkt(t+1)wkt))=O(ntd0(t)k=1logw(n/t)log(t+1t))=O(ntd0(t)logw(n/t)log(1+1/t))=O(nlogwnij=1n/ilog(1+1/ij)))\begin{array}{l} \sum_{i=1}^{n} p(i) n / i \leq n \sum_{i=1}^{n} \frac{1}{i} \sum_{j} d_{0}\left(\left\lfloor\frac{i}{w^{j}}\right\rfloor\right) \\ \\ =\mathcal O\left(n \sum_{t} d_{0}(t) \sum_{k=1}^{\log _{w}(n / t)} \sum_{p=w^{k}}^{w^{k}(t+1)-1} 1 / p\right) \\ \\ =\mathcal O\left(n \sum_{t} d_{0}(t) \sum_{k=1}^{\log _{w}(n / t)} \log \left(\frac{w^{k} t(t+1)}{w^{k} t}\right)\right) \\ \\ =\mathcal O\left(n \sum_{t} d_{0}(t) \sum_{k=1}^{\log _{w}(n / t)} \log \left(\frac{t+1}{t}\right)\right) \\ \\ =\mathcal O\left(n \sum_{t} d_{0}(t) \log _{w}(n / t) \log (1+1 / t)\right) \\ \\ \left.=O\left(n \log _{w} n \sum_{i} \sum_{j=1}^{n / i} \log (1+1 / i j)\right)\right) \end{array}

由于 log(1+1/x)=O(1/x)\log (1+1 / x)=\mathcal O(1 / x),则

=O(nlogwni1/ij=1n/i1/j))=O(nlog3n/logw)\left.=\mathcal O\left(n \log _{w} n \sum_{i} 1 / i \sum_{j=1}^{n / i} 1 / j\right)\right)=\mathcal O\left(n \log ^{3} n / \log w\right)

次线段树操作,总复杂度不超过 O(nlog4n/logw)\mathcal O\left(n \log ^{4} n / \log w\right),但似乎十分不满。

D:

非常好啊,还是贺的题解。

考虑把 2SAT 图建出来,缩点,此时缩完之后每一个点有一个与之对应的点,即为 invui n v_{u},这两个点的取值必须不同。

传递闭包之后,如果有 uinvuu \rightarrow i n v_{u} ,或 invuui n v_{u} \rightarrow u ,那么这一对点的取值就确定了,高处的那个为 0 ,低处的那个为 1 ,就可以忽略这对点了。

然后考虑在经过上述处理的图中进行暴搜。若在限制的意义下不连通 (即所有限制连边, uuinvui n v_{u} 连边形成的图不连通),则答案显然是各个连通块的乘积。

否则,考虑选择某一个点 uu ,枚举它是 0 还是 1。若是 0 ,那么所有 iui \rightarrow u 都是 0 ,所有 invuii n v_{u} \rightarrow i 都是 1 ,若是 1 则反过来。

所以说,枚举了一个点的取值之后,会多确定能由它到达,或到达它的所有点。

我们试图选择这些点个数最大的那个,然后将其去掉递归,考虑分析复杂度,我们试图用度数来限制,肯定减少的总和要大于度数。

若所有点度数 =0=0,则都是孤立点,连通块分解后是 O(1)\mathcal O(1) 的。

若所有点度数 1\leq 1,则连通块大小不会超过 2 ,连通块分解后是 O(1)\mathcal O(1) 的。

若所有点度数 2\leq 2,则是一个个链和环,如果我们随机选择一个最大的点确定,则期望会被切分成两半,那么这么递归是 O(poly(n))\mathcal O(\operatorname{poly}(n)) 的。

所以说,所有点度数至少是 3 ,也就是说复杂度是:

T(n)=poly(n)+max{T(n1)+T(n4),T(n2)+T(n3)}=O(1.3803n)T(n)=\operatorname{poly}(n)+\max \{T(n-1)+T(n-4), T(n-2)+T(n-3)\}=\mathcal O\left(1.3803^{n}\right)

实际上,由于去掉了一些点导致其它点的度数进一步降低,加上随机化的部分,这个算法很难卡满,数据使用了一个每个点度数都为 3 的二分图以及一些类似的结构,大概能卡到 2×1072\times 10^{7} 次左右的递归。

如果没有随机化,则链和环的情况无法处理,这样的复杂度是:

T(n)=poly(n)+max{T(n1)+T(n3),2T(n2)}=O(1.415n)T(n)=\operatorname{poly}(n)+\max \{T(n-1)+T(n-3), 2 T(n-2)\}=\mathcal O\left(1.415^{n}\right)

可能无法通过 n60n \leq 60