清华集训2014做题记录
已完成
- 【清华集训2014】玛里苟斯
- 【清华集训2014】主旋律
- 【清华集训2014】奇数国
- 【清华集训2014】卡常数
- 【清华集训2014】矩阵变换
- 【清华集训2014】sum
- 【清华集训2014】虫逢
- 【清华集训2014】玄学
- 【清华集训2014】文学
未完成
写一题要膜一题题解,膜完题解膜代码,膜完代码膜指导,膜了好几天了还有三个题没做。
【清华集训2014】玛里苟斯
我们可以证明一个集合的答案等于其线性基的答案,首先如果将一个集合中一个数 (x) 变成 (x oplus y) ,(y) 是集合中另外一个数,那么答案不会改变,于是就可以大力对这个集合做高消了,得出其答案等于其线性基的答案。
那么对于 (kgeq 3) ,线性基的大小不超过 (22) ,直接暴力枚举即可。
对于 (k = 1) ,每一位的贡献是独立的,记 (U =a_1cup a_2cup a_3...cup a_n) ,(U) 中的每一位出现的概率都是 $frac{1}{2} $,其余位都不可能出现,那么答案就是 (frac{1}{2}U) 。
对于 (k=2) ,有一个组合意义转化,变成每次选取的两位,考虑这两位乘积对答案的贡献。假设选取位 (x, y) ,对答案的贡献即是 (E(x^2+2xy+y^2)) ,当 (x) 和 (y) 线性无关的时候,(x) 和 (y) 为 (0,1) 的概率独立的为 (frac{1}{2}) ,当 (x,y) 线性相关的时候,(x, y) 只能同时被选或者同时不被选,所以概率要再乘 (2) 。判断两位是否线性相关,只需要判断线性基中每个向量这两位是否都相同即可。
【清华集训2014】主旋律
我们试图直接爆算集合 (S) 的非强连通导出子图数量,考虑将这个导出子图的所有强连通分量缩点后,一定是一个点数 (geq 2) 的 ( ext{DAG}) 。即缩完以后至少要有一个入度为 (0) 的点,这个条件充分性显然,必要性考虑如果不存在入度为 (0) 的点,那么一定存在一个环,说明并没有将所有强连通分量缩掉。然后我们枚举入度为 (0) 的点集 (T) ,记 (F(T,k)) 为将 (T) 划分成 (k) 个强连通分量的方案数,(cnt(A,B)) 表示集合 (A) 向 (B) 连边的数量。我们可以容斥算出不合法的方案数
合法的方案数就是
简单解释一下这个式子,我们不太好直接确定所有入度为 (0) 的点,容斥枚举其中入度为 (0) 的点的一个子集,它对答案的贡献就是 ((-1)^k) 剩下的边除了 (T) 内部不能再连以外都可以随便连,方案数就是后面那个。
这里要用到 (F(T,k)) ,其实它是打酱油的。事实上我们只需要对 (k) 按照奇偶性讨论,维护划分成奇数/偶数个强连通分量的方案 (f(T,0),f(T,1)) ,维护这个东西可以通过 (Ans) 来转移,为了避免算重,枚举一下 (S) 中编号最小的点处于哪一个强连通分量
这里存在一些相互转移的情况,但不难发现只有一个强连通分量时候虽然入度为 (0) 但是是合法方案,所以先处理 (Ans) 再更新 (f) 数组即可。
【清华集训2014】奇数国
利用 (varphi(n) = nprod_{p} frac{p_i-1}{p_i}) ,维护一下区间质因子集合以及区间乘积即可。
【清华集训2014】卡常数
KD树维护一下矩形框架,然后计算上界和下界减枝,卡卡常数就好了。
【清华集训2014】矩阵变换
问题转化为找一个行与选的数字的完美匹配,记 (pos[i][j]) 为数字 (i) 在第 (j) 行的出现位置,要求不存在匹配边 ((a,b),(c,d)) 使得 (pos[b][a] < pos[b][c] & pos[d][c] > pos[b][c]) 。
观察发现,这个式子相当于让一条边的权值看做 (pos[x][y]) ,当存在一个行与一个数没有匹配但是强行让它们匹配后数的权值会变大,行的权值会变小,这个时候就出现了不合法情况。那么就是一个稳定婚姻匹配的模型,GS算法解决之。
补充一下稳定婚姻匹配算法,每次选择一个没有匹配的左侧点对其没有考虑过的优先级最高的右侧点做一次check,如果右侧点没有匹配就先匹配,否则对右侧点来说优先级较小的那个失配,知道所有点都有匹配位置,复杂度 (mathcal O(n^2)) 。
【清华集训2014】sum
设
则
当 (frac{asqrt r+b}{c}geq 1) 有
于是转化为了 (frac{asqrt r+b}{c}< 1) 的情况
令
有
当 (a^2r-b^2|acsqrt r+bc) 有
其余时候
特判掉 (r) 是完全平方数的情况
【清华集训2014】虫逢
一道非常奇妙的题,先给每个元素随机标号,定义一个集合哈希值是这个集合中最小标号的元素的标号。
那么两个同源的虫哈希值相同的概率是 (frac{1}{3}) ,两个不同源的虫哈希值相同的概率约等于 (frac{1}{L}) ,考虑值域在 ([1,L^2]) 的 (L) 个随机数,最小值是 (mathcal O(L)) 级别的,可以感性理解后面这个概率。但是这样没什么用,需要进行双哈希,这样对于同源的虫相同的概率就是 (frac{1}{9}) ,对于不同源虫相同的概率就是 (frac{1}{n}) ,每次暴力对哈希值相同的集合进行 check,由于数据随机,期望复杂度是 (mathcal O(nL)) 的。
【清华集训2014】玄学
操作不支持交换律但是可以复合,把操作写成 (f(x) = ax+b) 的形式,可以简单得到操作复合后的结果。然后要做这么一件事情,维护操作序列,求操作序列一段区间的操作覆盖在 (x) 上的复合结果是多少。
考虑一个操作区间上的操作实际上可以看做一个分段函数,并且分段函数的端点都是可以暴力维护的,每次新增一个操作,使用二进制分组的思想暴力重构若干个区间的分段函数,就解决了强制在线的问题。二进制分组的时候保留一下每一层的结果,查询就只要对应区间从左到右复合过去即可。
重构的部分之前被略去了,实际上是将左边的分段函数与右边的分段函数复合,那么只要将右边的分段函数加到对应的左边的分段函数上去即可,维护一下新的分段函数的端点。
【清华集训2014】文学
考虑最终选取的半平面的补的交一定是一个凸包。简单反证,如果不是一个凸包一定可以拿掉一些半平面使它变成一个凸包,被原半平面覆盖的区域不变。
那么先判掉一个半平面覆盖所有点集的情况,然后枚举两个半平面的交,钦定交点为这个凸包的左下端点。因为最终选取的交是一个凸包,所以每一个半平面覆盖掉的实则是凸包的一条边对应的区域,反证可以得到这个区域在凸包的极角序上是连续的。因为如果不是连续的,中间必然存在一个点在凸包边的另一侧,与凸包矛盾。
那么对于剩下的每一个半平面,把其可以覆盖的连续段都找出来,记 (g[l][r]) 表示选取一个半平面覆盖极角序上 ([l,r]) 的所有点的最小代价,用这个转移覆盖所有点的最小代价即可。这个时候有可能会出现两段被同一个半平面覆盖的点计算了这个半平面的两次代价,但我们之前证明了一个半平面在最优解中只会覆盖连续的一段,所以不需要考虑这种情况。