Codeforces Round #453 (Div. 1)
A. Hashing Trees
题目描述:给出一棵树的高度和每一层的节点数,问是否有两棵树都满足这个条件,若有,则输出这两棵树,否则输出perfect
solution
首先判断什么时候是perfect:当不存在相邻两层的节点数均大于\(0\)时,输出perfect。
接下来就是构造的问题。若上一层只有一个节点,那么这一层的所有节点只能连到那个唯一的节点,否则分为两棵树不同的构造:
- 所有点都连到上一层的第一个节点
- 第一个点连到上一层的第一个节点,其它点连到上一层的第二个节点。
时间复杂度:\(O(n)\)
B. GCD of Polynomials
题目描述:将求两个数的公因数的辗转相除法拓展到求两个多项式的公因式上去。给定一个数\(n\),求两个多项式,使得该多项式的系数的绝对值小于等于\(1\),且运用了\(n\)步辗转相除。
solution
手工计算前几项可以发现:
\[p_0=1, p_1=x\]
\[p_{n+1}=xp_n \pm p_{n-1}\]
是加号还是减号需要判断一下,但总有一个符号能满足条件。最终的答案就是\(p_n, p_{n-1}\)
时间复杂度:\(O(n^2)\)
C. Bipartite Segments
题目描述:给定一个有\(n\)个点的无向图,满足图中没有长度为偶数的环。有\(q\)个询问,每次询问给定一个区间\([L, R]\), 问有多少个子区间\([x, y], (L \leq x \leq y \leq R)\), 使得只包含\([x, y]\)的点和它们之间的边的子图是二分图。
solution
由题目条件可以看出,该图是一棵顶点仙人掌,而且图中的环的长度都是奇数,又因包含奇环的图都不是二分图,所有由区间\([x, y]\)构成的图不能有环。
首先找出每个环中编号最大值和最小值,以此来求出对于每个点\(i\),最大的\(Rmax[i]\)使得\([i, Rmax[i]]\)没有环,这个从大到小扫一下就好了。对于每个询问,答案为\((\sum min(Rmax[i], R)-i+1)\),由于\(Rmax[i]\)是递增的,所以可以二分求出最大的\(j\),使得\(Rmax[j] \leq R\),\([L, j]\)可由部分和求出,后面的直接用求和公式就好。
时间复杂度:\(O(qlogn)\)
D. Weighting a Tree
题目描述:给定一个无向连通图,每个点都有一个值\(c_i\),\(c_i\)的奇偶性与\(i\)的度相同,现给每条边添加一个边权,使得每个点所连的边的边权之和等于\(c_i\),求一种方案或无解。
solution
考虑两种情况:
- 该图是一个二分图。如果二分图的两边的\(c_i\)之和不同,则无解,否则随便找出一棵生成树,令不在树上的边权为\(0\)。随便找一个点为根,然后从叶子节点开始给边赋值即可。
- 该图有奇环。随便找出一个奇环,然后整个图随便找一棵生成树,令不在树上的边权为\(0\)。随便找一个在之前找的奇环里的点为根,然后从叶子节点开始给边赋值。最终有可能根的\(c_i\)是不满足的(满足的话直接输出答案即可),记当前与根相连的边权和为\(sum\)。找出在环中的与根相连的边,将该边的权值加\(x\),然后沿着奇环将边权\(-x,+x,-x, ..., +x\)交替运算,其中\(x=\frac{c_i-sum}{2}\)(这里一定能整除)。这样除了根,在环中的点所连的边的边权总和不变,而与根相连的总和增加了\(c_i-sum\),使得根满足条件。
时间复杂度:\(O(n)\)
E. Cyclic Cipher
题目描述:现有一个方法来加密一个长度为\(n\)的序列\(a_i\),为加密这个序列,我们会选择一个密钥\(b_i(0\leq i<n)\)。\(b_i\)有一个特点,那就是它每一个循环置换的数组都是线性无关的,也就是说,不存在一组非零系数,使得\(\sum_{i=0}^{n-1} x_ib_{(k-i)mod(n)}=0\)对于所有的\(k\)都成立。加密过程为:
\[c_i=\sum_{k=0}^{n-1}(b_{(k-i) mod (n)}-a_k)^2\]
现给出\(c_i,b_i\),求出所有满足的\(a_i\)
solution
观察\(c_i, c_{i-1}\):
\[c_i=\sum_{k=0}^{n-1}(b_{(k-i) mod (n)}-a_k)^2\]
\[=\sum_{k=0}^{n-1} (b_{(k-i) mod (n)}^2 - 2a_kb_{(k-i) mod (n)} + a_k^2)\]
\[c_{i-1}=\sum_{k=0}^{n-1}(b_{(k-i+1) mod (n)}-a_k)^2\]
\[=\sum_{k=0}^{n-1} (b_{(k-i+1) mod (n)}^2 - 2a_kb_{(k-i+1) mod (n)} + a_k^2)\]
第一项是\(\sum b_i^2\)(两个式子只是循环置换了而已,本质都是平方和), 第三项是\(\sum a_k^2\), 只有第二项是不一样的。因此
\[c_i-c_{i-1}=-2\sum_{k=0}^{n-1} a_k(b_{(k-i) mod (n)} - b_{(k-i+1) mod (n)})\]
设\(b‘_i=b_i-b_{i-1}, c‘_i=\frac{c_i-c_{i-1}}{2}\),则
\[c‘_i=\sum_{k=0}^{n-1} a_kb_{(k-i+1) mod (n)}\]
设\(p=k-i+1\),则
\[c‘_i=\sum_{p=0}^{n-1} b‘_pa_{p+i-1}\]
设
\[B=\sum_{k=0}^{n-1} b‘_kx^k, A=\sum_{k=0}^{n-1}a_kx^{n-k}, C=\sum_{k=0}^{n-1} c‘_kx^k\]
则\(C=AB\),符合卷积运算,用FFT就能逆推出来,但在逆推过程中会出现多解,具体可参考题解,但我觉得里面的符号有点乱。