C. Sequence Master
Posted onlyblues
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C. Sequence Master相关的知识,希望对你有一定的参考价值。
C. Sequence Master
For some positive integer $m$, YunQian considers an array $q$ of $2m$ (possibly negative) integers good, if and only if for every possible subsequence of $q$ that has length $m$, the product of the $m$ elements in the subsequence is equal to the sum of the $m$ elements that are not in the subsequence. Formally, let $U=\\1,2,\\ldots,2m\\$. For all sets $S \\subseteq U$ such that $|S|=m$, $\\prod\\limits_i \\in S q_i = \\sum\\limits_i \\in U \\setminus S q_i$.
Define the distance between two arrays $a$ and $b$ both of length $k$ to be $\\sum\\limits_i=1^k|a_i-b_i|$.
You are given a positive integer $n$ and an array $p$ of $2n$ integers.
Find the minimum distance between $p$ and $q$ over all good arrays $q$ of length $2n$. It can be shown for all positive integers $n$, at least one good array exists. Note that you are not required to construct the array $q$ that achieves this minimum distance.
Input
The first line contains a single integer $t$ ($1\\le t\\le 10^4$) — the number of test cases. The description of test cases follows.
The first line of each test case contains a single integer $n$ ($1\\le n\\le 2\\cdot10^5$).
The second line of each test case contains $2n$ integers $p_1, p_2, \\ldots, p_2n$ ($|p_i| \\le 10^9$).
It is guaranteed that the sum of $n$ over all test cases does not exceed $2\\cdot 10^5$.
Output
For each test case, output the minimum distance between $p$ and a good $q$.
Example
input
4 1 6 9 2 1 2 2 1 2 -2 -2 2 2 4 -3 -2 -1 0 1 2 3 4
output
3 2 5 13
Note
In the first test case, it is optimal to let $q=[6,6]$.
In the second test case, it is optimal to let $q=[2,2,2,2]$.
解题思路
首先直觉上就会觉得满足条件的$q$数量会很少,同时可以发现$q = [ \\ \\overbrace0,0,\\ldots,0^2n \\ ]$一定是满足条件的,因此对于$\\forall n \\in \\mathbbZ$,总是存在一个$q$,即一定有解。我们接下来再考虑是否存在其他满足条件的$q$。
先考虑$q$中所有元素都相同的情况。
很明显当$n=1$的情况,必然会有$q_1 = q_2$,可以等于任意值。
当$n=2$,假设每个元素都为$x$,那么必然会有$x^n = n \\cdot x \\ \\Rightarrow \\ x = \\sqrt[n-1]n = 2$。同时根据该等式,很明显当$n > 2$时等式不存在正整数解。
因此只有当$n=1$或$n=2$,才存在除了全$0$以外所有元素都相同的$q$。
接下来考虑$q$中所有元素不都相同的情况,先考虑$n$为偶数的情况。
由于此时$q$中至少存在两个元素不同,不妨假设$q_1 \\ne q2$。满足等式$$\\begincases q_1\\cdot q_3q_4\\cdots q_n+1=q_2+q_n+2+q_n+3+\\cdots+q_2n \\ \\ \\ \\ \\ \\ \\ (1) \\\\\\\\ q_2\\cdot q_3q_4\\cdots q_n+1=q_1+q_n+2+q_n+3+\\cdots+q_2n \\ \\ \\ \\ \\ \\ \\ (2) \\endcases$$
$(1)-(2)$得到$$(q_1-q_2)q_3q_4\\cdots q_n+1=q_2-q_1 \\ \\Rightarrow \\ (q_1-q_2)(q_3q_4\\cdots q_n+1+1)=0$$
由于$q_1 \\ne q_2$,因此必然有$q_3q_4\\cdots q_n+1+1 = 0$,即$q_3q_4\\cdots q_n+1 = -1$。由于$q_i \\in \\mathbbZ$,有奇数个$q_i$连乘,故只能有$q_i = -1$。
同理我们考虑其他类似的约束条件,即$U=\\3, 4, \\ldots, 2n\\$,对于$U$所有满足$|S| = n-1$的子集$S \\subseteq U$,有$$\\begincases q_1 \\cdot \\prod\\limits_i \\in S q_i = q_1 + \\sum\\limits_i \\in U \\setminus S q_i \\\\\\\\ q_2 \\cdot \\prod\\limits_i \\in S q_i = q_2 + \\sum\\limits_i \\in U \\setminus S q_i \\endcases$$
就可以发现$q_3=q_4=\\cdots =q_2n = -1$,把结果代入$(1)$式,就会得到$q_1+q_2=n-1$。同时又因为$q_1q_2\\cdots q_n=q_n+1+\\cdots q_2n$,因此有$q_1q_2=-n$。这样就可以解得$\\q_1,q_2\\=\\-1,n\\$。
即对于$n$为偶数的情况,我们可以构造出$q = [ \\ \\overbrace-1,-1,\\ldots,-1^2n-1, \\ n \\ ]$。
那么对于$n$为奇数的情况呢?与上面的推导过程一样,最后得到$q_3q_4\\cdots q_n+1 = -1$,由于$q_i \\in \\mathbbZ$,此时有偶数个$q_i$连乘,很明显此时没有解。
故只有当$2 \\mid n$,有$q = [ \\ \\overbrace-1,-1,\\ldots,-1^2n-1, \\ n \\ ]$。
接下来我们只需要针对$n$来分类讨论取最小值就可以了:
- 先考虑$q$中元素均为$0$的情况,此时最小值为$\\textans = \\sum\\limits_i=1^2n|p_i|$。
- 如果$n=1$,为了得到最小值构造$q = [p_1, p_1]$或$q = [p_2, p_2]$,那么就有$\\textans = \\min\\left\\ \\textans, \\ |p_1 - p_2| \\right\\$。
- 如果$n=2$,构造$q = [2,2,2,2]$,那么就有$\\textans = \\min\\left\\ \\textans, \\ \\sum\\limits_i=1^4|p_i - 2| \\right\\$。
- 最后如果$2 \\mid n$,构造$q = [ \\ \\overbrace-1,-1,\\ldots,-1^2n-1, \\ n \\ ]$。对$p$从小到大排序,那么就有$\\textans = \\min\\left\\ \\textans, \\ \\sum\\limits_i=1^2n|p_i - q_i| \\right\\$。
关于上面的第$4$步,如果有序列$p$和$q$,定义两个序列的距离为$\\sum\\limits_i=1^n|p_i-q_i|$。如果可以任意排列两个序列的元素,那么当$p$和$q$均满足非递减顺序时,即$p_1 \\leq p_2 \\leq \\cdots \\leq p_n$,$q_1 \\leq q_2 \\leq \\cdots \\leq q_n$,此时距离能够取到最小值,证明见附录部分。
AC代码如下,时间复杂度为$O(n \\logn)$:
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 4e5 + 10; int a[N]; void solve() int n; scanf("%d", &n); n *= 2; LL ret = 0; for (int i = 0; i < n; i++) scanf("%d", a + i); ret += abs(a[i]); if (n == 2) ret = min(ret, (LL)abs(a[0] - a[1])); else if (n == 4) LL s = 0; for (int i = 0; i < n; i++) s += abs(a[i] - 2); ret = min(ret, s); if (n / 2 % 2 == 0) sort(a, a + n); LL s = abs(a[n - 1] - n / 2); for (int i = 0; i < n - 1; i++) s += abs(a[i] + 1); ret = min(ret, s); printf("%lld\\n", ret); int main() int t; scanf("%d", &t); while (t--) solve(); return 0;
其中对于第$4$步,由于$q$中只有一个元素是$n$,其余的元素都是$-1$,因此我们可以枚举$p$中哪个元素与$n$求差。定义$s = \\sum\\limits_i=1^2n|p_i+1|$,那么如果$p_k$与$n$作差,就有$\\sum\\limits_i=1^n|p_i-q_i| = s - |p_k+1| + |p_k-n|$。
AC代码如下,时间复杂度为$O(n)$:
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 4e5 + 10; int a[N]; void solve() int n; scanf("%d", &n); n *= 2; LL ret = 0; for (int i = 0; i < n; i++) scanf("%d", a + i); ret += abs(a[i]); if (n == 2) ret = min(ret, (LL)abs(a[0] - a[1])); else if (n == 4) LL s = 0; for (int i = 0; i < n; i++) s += abs(a[i] - 2); ret = min(ret, s); if (n / 2 % 2 == 0) LL s = 0; for (int i = 0; i < n; i++) s += abs(a[i] + 1); for (int i = 0; i < n; i++) ret =min(ret, s - abs(a[i] + 1) + abs(a[i] - n / 2)); printf("%lld\\n", ret); int main() int t; scanf("%d", &t); while (t--) solve(); return 0;
附录
有序列$p$和$q$,定义两个序列的距离为$\\sum\\limits_i=1^n|p_i-q_i|$,序中的元素可以任意重新排序。证明当满足$p_1 \\leq p_2 \\leq \\cdots \\leq p_n$,$q_1 \\leq q_2 \\leq \\cdots \\leq q_n$时,两个序列的距离取到最小值。
不妨固定$p$,使得$p_1 \\leq p_2 \\leq \\cdots \\leq p_n$。同时$q$不满足$q_1 \\leq q_2 \\leq \\cdots \\leq q_n$,因此至少存在一对$q_i$和$q_j$,满足$q_i \\geq q_j$且$i < j$。
如果$q_i = q_j$,仅考虑$i, \\ j$两个位置对距离的贡献,那么很明显不管是否交换$p_i$和$p_j$,$i, \\ j$两个位置对距离的贡献都相同,因此我们只考虑$q_i > q_j$,且$p_i < p_j$的情况。
接下来证明通过交换$q_i$和$q_j$,能够使得$i, \\ j$两个位置对距离的贡献减少。为此我们假设$p_i = a, \\ p_j = b, \\ q_i = d, \\ q_j = c$,同时有$a < b, \\ c < d$。
分情况讨论:
$1.$ $b \\leq c$,即$a < b \\leq c < d$:
交换$c$和$d$前,距离为$|a - d| + |b - c| = d - a + c - b$,交换$c$和$d$后,有$d < c$,距离就变成$|a - c| + |b - d| = c - a + d - b$,用交换前减去交换后得到$d - a + c - b - (c - a + d - b) = 0$,即交换后的距离不变。
$2.$ $a \\leq c < b$:
$2.1.$ $b \\leq d$,即$a \\leq c < b \\leq d$:
交换$c$和$d$前,距离为$|a - d| + |b - c| = d - a + b - c$,交换$c$和$d$后,有$d < c$,距离就变成$|a - c| + |b - d| = c - a + d - b$,用交换前减去交换后得到$d - a + b - c - (c - a + d - b) = 2(b - c) > 0$,即交换后的距离变小。
$2.2.$ $b > d$,即$a \\leq c < d < b$:
交换$c$和$d$前,距离为$|a - d| + |b - c| = d - a + b - c$,交换$c$和$d$后,有$d < c$,距离就变成$|a - c| + |b - d| = c - a + b - d$,用交换前减去交换后得到$d - a + b - c - (c - a + b - d) = 2(d - c) > 0$,即交换后的距离变小。
$3.$ $c < a$:
$3.1.$ $b \\leq d$,即$c < a < b \\leq d$:
交换$c$和$d$前,距离为$|a - d| + |b - c| = d - a + b - c$,交换$c$和$d$后,有$d < c$,距离就变成$|a - c| + |b - d| = a - c + d - b$,用交换前减去交换后得到$d - a + b - c - (a - c + d - b) = 2(b - a) > 0$,即交换后的距离变小。
$3.2.$ $a \\leq d < b$,即$c < a \\leq d < b$:
交换$c$和$d$前,距离为$|a - d| + |b - c| = d - a + b - c$,交换$c$和$d$后,有$d < c$,距离就变成$|a - c| + |b - d| = a - c + b - d$,用交换前减去交换后得到$d - a + b - c - (a - c + b - d) = 2(d - a) \\geq 0$,即交换后的距离变小。
$3.3.$ $d < a$,即$c < d < a < b$:
交换$c$和$d$前,距离为$|a - d| + |b - c| = a - d + b - c$,交换$c$和$d$后,有$d < c$,距离就变成$|a - c| + |b - d| = a - c + b - d$,用交换前减去交换后得到$a - d + b - c - (a - c + b - d) = 0$,即交换后的距离不变。
综上所述,如果序列$p$满足$p_1 \\leq p_2 \\leq \\cdots \\leq p_n$,对于序列$q$如果存在$q_i$和$q_j$满足$q_i > q_j$且$i < j$,那么交换$q_i$和$q_j$能使得距离变小。为了使得距离最小,最终$q$一定满足$q_1 \\leq q_2 \\leq \\cdots \\leq q_n$。
定理得证。
同时可以推导得到当序列$p$和$q$满足$p_1 \\leq p_2 \\leq \\cdots \\leq p_n$,$q_1 \\geq q_2 \\geq \\cdots \\geq q_n$时,两个序列的距离取到最大值。
参考资料
Codeforces Round #858 (Div. 2) Editorial:https://codeforces.com/blog/entry/114048
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/17233791.html
以上是关于C. Sequence Master的主要内容,如果未能解决你的问题,请参考以下文章
C. Sequence Pair Weight——Codeforces Round #721 (Div. 2)
Codeforces Round #721 (Div. 2) C. Sequence Pair Weight(计算贡献/STL)