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$来分类讨论取最小值就可以了:

  1. 先考虑$q$中元素均为$0$的情况,此时最小值为$\\textans = \\sum\\limits_i=1^2n|p_i|$。
  2. 如果$n=1$,为了得到最小值构造$q = [p_1, p_1]$或$q = [p_2, p_2]$,那么就有$\\textans = \\min\\left\\ \\textans, \\ |p_1 - p_2| \\right\\$。
  3. 如果$n=2$,构造$q = [2,2,2,2]$,那么就有$\\textans = \\min\\left\\ \\textans, \\ \\sum\\limits_i=1^4|p_i - 2| \\right\\$。
  4. 最后如果$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

以上是关于C. Sequence Master的主要内容,如果未能解决你的问题,请参考以下文章

C. Sequence Transformation

C. Sequence Pair Weight——Codeforces Round #721 (Div. 2)

Codeforces Round #721 (Div. 2) C. Sequence Pair Weight(计算贡献/STL)

C. Sequence Pair Weight(组合计数)

Codeforces Round #721 (Div. 2) C. Sequence Pair Weight

Codeforces Round #721 (Div. 2) C. Sequence Pair Weight