选了几道比较典型(简单)的题。
zky 原创题
给定一个序列,要求支持:
- 区间翻转。
- 查询从区间中选出一个子集能获得的最大异或和。
\(n,q\le 5\times 10^4,0 \le a_i < 2^{60}\)
solution
每个数随机选和不选,计算一个区间选的数的异或和。重复这样 \(100\) 次。对于每次的异或和用线性基计算最大值。复杂度 \(O(n\log n \log V)\)
正确性证明:这个区间的子集线性基个数为 \(l\),考虑之前已经有 \(x<l\) 个基了,那么有 \(2^x\) 个选出来的数没用,总共有 \(2^l\) 个可能选出来的数,每个数选中的概率相等,那么有用的概率为 \(\frac{1}{2}\)。
一般图最大匹配
...
solution
考虑建出一个矩阵 \(A\),如果 \(u,v\) 之间有边,那么随机一个数 \(x\) 使 \(A_{u,v}=x,A_{v,u}=-x\),否则 \(A_{u,v}=A_{v,u}=0\)。
若 \(det(A)\neq 0\) 则 \(A\) 存在完美匹配:
考虑每个方案 \(p\),贡献为 \(sgn(p)\prod_{i=1}{n}A_{i,p_i}\)。如果贡献不为 \(0\),说明 \(i\) 和 \(p_i\) 之间右边,并且这些边形成一些环。对于奇环,发现翻转后 \(sgn(p)\) 的正负性不变,\(\prod_{i=1}{n}A_{i,p_i}\) 的正负性变了,所以奇环的方案会相互抵消。如果所有都是偶环,那么存在完美匹配。
\(maxmatch=\frac{rk(A)}{2}\):
取出最大匹配中的点的行,发现它们线性无关。对于一个子矩阵 \(r\),若线性无关,则存在完美匹配。
「THUSC 2017」巧克力
给定 \(n,m\) 和两个 \(n\times m\) 的矩阵 \(a,c\),求一个矩阵的连通块使得 这个连通块内的 \(c\) 至少出现了 \(k\) 个不同的数。在最小化连通块大小的前提下最小化连通块内 \(a\) 的中位数。
\(n \times m \le 233,k\le5\)
solution
对于中位数直接二分即可。由于 \(k\) 很小考虑,把所有 \(c\) 都映射到 \([1,k]\),然后跑最小斯坦纳树,为保证正确性要多跑几次。\(O(Tnm2^k\log nm)\)。
有向图哈密顿路
给定一张有向图,要求找出一条 \(k\) 个点的路径使得路径上的所有点互不相同。
\(n\le 100,m\le 200,k\le 15\)
solution
对每个点随机一个 \(k\) 维的向量,对每条边随机一个数,一条路径 \(v_1,\ldots,v_k\) 的贡献为 \(det(v_1|\ldots|v_k)\prod_{e\in Edge\ of\ Path} w_e\)。发现如果走到两个相同的点,那么这个矩阵就会出现两个相同的行,那么行列式就为 \(0\)。至于给每条边随机分配权值的目的是防止出题人卡 \(mod\),随机一个 \(mod\) 也不是不行。
计算出以每个节点为终点的路径的贡献之和。设置状态 \(f_{i,S}\) 代表当前在点 \(i\),已经选了 \(S\) 中的行的元素。\(O((n + m)2^kk)\)。
无向二分图哈密顿路
...
\(n\le 100,m\le 200,k\le 25\)
solution
可以发现如果重复经过了一个点,即 \(x,v_1,\ldots,v_k,x\),那么可以翻转成 \(x,v_k,\ldots,v_1,x\)。考虑如果用 \(x+x=0\) 的运算方式(例如 nim 积和 xor),那么这个东西就可以抵消掉。
对于 \(a,b,a\) 翻转完还是一样的,可以特判不能这么走。但这样特判之后,\(p,a,\ldots,p,a\) 翻转完为 \(p,a,p,\ldots,a\),因为不能出现 \(p,a,p\),所以翻转后的方案没有被算到。但这样的方案,左部点和右部点都会出两次相同的数,我们可以只对左部点进行行列式计算。\(O(n^22^{\frac{k}{2}}k)\)。
无向图哈密顿路
...
\(n\le100,m\le200,k\le19\)
solution
随机每个点加入右边点还是左部点。
考虑对左部点算进行列式中。考虑对右部点去重,如果 \(a,b,a\) 在右部点内部可以直接把边算进行列式中。
只有左部点指向右部点不会增加行列式规模,由于随机,左部点指向右部点边数期望为 \(\frac{k}{4}\)。\(O(n^22^{\frac{3k}{4}}k)\)。