Codeforces 1188 题解

A

首先对于 A1 题,可以加减任意实数,结论是答案为 YES 当且仅当没有度数为 (2) 的点。必要性显然,充分性通过下面的构造来证明。
A2 题的构造:考虑随便找一个叶子节点为根,记为 (rt)。则对于任何一个非根节点 (u),我们可以实现将根到该点的路径上的边权 (+w),其中 (w) 为任意偶数,其余边权不变。如果 (u) 是叶子,那么直接执行操作 ((rt,u,w));否则 (u) 点子树内一定有两个来自不同子树的叶子,设为 (v_1,v_2),则执行 ((rt,v_1,frac{w}{2}),(rt,v_2,frac{w}{2}),(v_1,v_2,-frac{w}{2})). 那么我们直接自底而上每次计算出要新加的权值然后按这种方法构造即可。
时间复杂度 (O(n))(O(n^2)),操作次数不超过 (3n).
代码: A1: 56571529 A2: 74629864

B

由于 (forall i,j, a_i-a_j eq 0),原条件等价于 ((a_i-a_j)(a_i+a_j)(a_i^2+a_j^2)=a_i^4-a_j^4=k(a_i-a_j)). 把 ((a_i^4-ka_i)mod p) 丢进 set 中即可。
时间复杂度 (O(nlog p)).
代码: 74623487

C

首先对 (a_i) 排序。考虑对每个 (i) 求出有多少个权值 (ge i) 的子序列。直接设 (f[i][j]) 表示长度为 (i) 的序列末尾是 (a_j) 的方案数,前缀和转移即可做到一次 DP 复杂度 (O(nk)),那么总的复杂度就是 (O(nkmax a_i)).
考虑优化,我们发现价值一定不超过 (frac{max a_i}{k-1}),于是就做完了。
时间复杂度 (O(nmax a_i)).
代码: 74622276

D

首先对 (a_i) 排序并令 (a'_i=max^n_{j=1} a_j-a_i). 目标转化为给所有的 (a_i) 同时加上一个数 (X),最小化所有数 (1) 的数位个数总和。
考虑数位 DP,设 (f[i][j]) 表示 (X)(0)((i-1)) 位是 (j),这时发现只有一个后缀的 (a_i) 会发生进位。于是把第二维改成前 (j) 小的数不会发生进位 (后面的数会发生进位),转移分类讨论一下,发现只需要把所有数按 (mod 2^{i+1}) 的值排序然后求出每个前缀内有多少个第 (i) 位为 (1) 的数就可以做到 (O(1)) 转移。应该可以用归并排序优化复杂度。
时间复杂度 (O(nlog nlog W)) ((W=max a_i)) 或 (O(nlog W)).
代码: 74606189

E

题解: https://www.cnblogs.com/suncongbo/p/12591476.html

原文地址:https://www.cnblogs.com/suncongbo/p/12697816.html