Codeforces Round #572 (Div. 2) 简要题解

A:Keanu Reeves

\(\text{Problem}\):给出一个 \(01\) 字符串,将其划分为若干个串,使得每个串的 \(0\)\(1\) 数量都不同。

\(\text{Solution}\):显然最多只会被划分成两个串。特殊考虑 \(n=1\) 的情况,记录一下原串 \(0\)\(1\) 的个数 \(x,y\)。如果 \(x=y\),则需要找到一个 \(x\not=y\) 的位置将字符串分成两个输出,否则直接输出原串。

\(\text{Code}\)http://codeforces.com/contest/1189/submission/88587340


B:Number Circle

\(\text{Problem}\):给出 \(n\) 个数,将它们排列成一个环形,使得每个数都严格小于它相邻两数之和。

\(\text{Solution}\):考虑到先把给出的序列 \(a\) 排序。发现我们可以构造出使得 \(a_{n}\) 的两边是 \(a_{n-1}\)\(a_{n-2}\),且对于 \(\forall i<n\),可以使得与 $a_{i} $ 相邻两数中一定有一个数大于等于 \(a_{i}\),于是只要判断 \(a_{n-1}+a_{n-2}\)\(a_{n}\) 的大小关系即可。

\(\text{Code}\)http://codeforces.com/contest/1189/submission/88588164


C:Candies!

\(\text{Problem}\):给出 \(n\) 个数的序列 \(a\),每次查询一个长度为 \(2\) 的整数次幂的区间,问这个区间把相邻两数合并为 \(x\),获得 \(\lfloor \frac{x}{10} \rfloor\) 的贡献,并把 \(x\) 变为 \(x\%10\),当这个区间被合并为只有一个数时,总贡献为多少。

\(\text{Solution}\):题面花里胡哨的,其实显然维护一下 \(a_{i}\) 的前缀和 \(qz_{i}\),对于一个区间 \([L,R]\),贡献就是 \(\lfloor \frac{qz_{R}-qz_{L-1}}{10} \rfloor\)

\(\text{Code}\)http://codeforces.com/contest/1189/submission/88588555


D1:Add on a Tree

\(\text{Problem}\):给定一棵树,树上的边权初始为 \(0\),可以在任意两个叶子之间的简单路径上的边上加上一个权值实数 \(x\)。问能否在有限次数的操作内,得到边权任意组合的树。

\(\text{Solution}\):考虑到无法满足条件的树,一定满足存在一组边 \((x,y)\),使得边 \(x\) 和边 \(y\) 的权值永远相同,即它们同时被改变或同时不变。易发现当存在一个度为 \(2\) 的点时这棵树无法满足条件。否则,当不存在度为 \(2\) 的点时,对于所有度大于等于 \(3\) 的点,一定可以从与它相邻的边中任选组合进行改变边权,可以得到边权任意组合的树。

\(\text{Code}\)http://codeforces.com/contest/1189/submission/88588792


D2:Add on a Tree: Revolution

\(\text{Problem}\):给定一棵带边权的树,每条边的权值都为偶数且满足每条边的权值互不相同。每次可以选择两个叶子节点,并且把这两个点的所有边加上或减去一个整数。问是否可以通过若干次操作,使得所有边权都变成 \(0\),并输出一组合法操作。

\(\text{Solution}\):判断无解情况与 \(D1\) 相同。考虑钦定一个度数为 \(1\) 的点为根节点。从下往上进行操作,当遇到一个度数大于等于 \(3\) 的点 \(x\) 时,它的子树内所有边权已经被修改完毕,现在要修改的是 \(x\)\(fa_{x}\) 之间这条边权的值。考虑对于每个叶子节点 \(x\),我们都把它与根节点的路径上所有边权加上 \(x\)\(fa_{x}\) 之间的目标边权 \(w\)。那么 \(fa_{x}\) 要么是根节点,要么是一个度数大于等于 \(3\) 的节点。对于度数大于等于 \(3\) 的节点 \(y\),记 \(y\)\(fa_{y}\) 这条边权权值为 \(w\)\(y\) 与所有子节点之间边权之和为 \(tot\),随便从 \(y\) 的子树中取两个叶子节点 \(p,q\),则我们可以把 \(p\)\(q\)\(root\) 的路径上所有边权加上 \((w-tot)/2\),再把 \(p\)\(q\) 的路径上所有边权加上 \((tot-w)/2\) 即可。由于所有边权均为偶数,所以此做法可行。

\(\text{Code}\)http://codeforces.com/contest/1189/submission/88766078


E:Count Pairs

\(\text{Problem}\):给定一个长度为 \(n\) 的序列 \(a\),一个质数 \(p\),和一个正整数 \(k\),求所有满足 \(i<j\)\((a_{i}+a_{j})\times (a_{i}^2+a_{j}^2)\equiv k \bmod p\)\((i,j)\) 对数。

\(\text{Solution}\):考虑能否把式子化为没有同时包含关于 \(i\)\(j\) 的单项式。考虑平方差公式,可以在同余方程两边同时乘上一个 \((a_{i}-a_{j})\),则原方程变为:

\[\qquad a_{i}^4-a_{j}^4 \equiv k(a_{i}-a_{j}) \bmod p \]

\[\qquad a_{i}^4-ka_{i}\equiv a_{j}^4-ka_{j} \bmod p \]

显然可以用 \(map\) 直接维护。

\(\text{Code}\)http://codeforces.com/contest/1189/submission/88589206


F:Array Beauty

\(\text{Problem}\):定义一个序列的贡献为该序列中最小的两数差绝对值。给出一个长度为 \(n\) 的序列 \(a\) 和正整数 \(k\),求出长度为 \(k\)\(a\) 的所有子序列的总贡献。

\(\text{Solution}\):显然将原序列排序后不影响答案。考虑 \(dp\),记 \(f_{v,i,j}\) 表示在前 \(i\) 个数中选了 \(j\) 个数,第 \(i\) 个数被选中且这 \(j\) 个数的贡献大于等于 \(v\) 的答案。则枚举 \(v\)\(f_{v,n,k}\) 即为答案。时间复杂度为 \(O(vn^2k)\)。考虑枚举 \(a_{i}\) 已经被排序,则如果 \(i\)\(k\) 转移而来,\(k\) 选择区间的右端点一定单调不减。这样时间复杂度优化为 \(O(vnk)\)。考虑到长度为 \(k\) 的子序列,贡献最大为 \(v/(k-1)\)\(v\) 为值域。则时间复杂度优化为 \(O(nv)\),可过。

\(\text{Code}\)http://codeforces.com/contest/1189/submission/88593869

posted @ 2020-08-03 10:29  zkdxl  阅读(153)  评论(1编辑  收藏  举报