Equalize
题面翻译
有一个给定的长度为 n 的数列 a,现在加上一个排列 b,即 ci=ai+bi。
现在求对于所有可能的 b,c 中出现最多的数的出现次数的最大值。
translate by @UniGravity.
题目描述
Vasya has two hobbies — adding permutations † to arrays and finding the most frequently occurring element. Recently, he found an array a and decided to find out the maximum number of elements equal to the same number in the array a that he can obtain after adding some permutation to the array a .
More formally, Vasya must choose exactly one permutation p1,p2,p3,…,pn of length n , and then change the elements of the array a according to the rule ai:=ai+pi . After that, Vasya counts how many times each number occurs in the array a and takes the maximum of these values. You need to determine the maximum value he can obtain.
† A permutation of length n is an array consisting of n distinct integers from 1 to n in arbitrary order. For example, [2,3,1,5,4] is a permutation, but [1,2,2] is not a permutation ( 2 appears twice in the array), and [1,3,4] is also not a permutation ( n=3 but there is 4 in the array).
输入格式
Each test consists of multiple test cases. The first line contains a single integer t ( 1≤t≤2⋅104 ) — the number of test cases. Then follows the description of the test cases.
The first line of each test case contains a single integer n ( 1≤n≤2⋅105 ) — the length of the array a .
The second line of each test case contains n integers a1,a2,…,an ( 1≤ai≤109 ) — the elements of the array a .
It is guaranteed that the sum of n over all test cases does not exceed 2⋅105 .
输出格式
For each test case, output a single number — the maximum number of elements equal to the same number after the operation of adding a permutation.
样例 #1
样例输入 #1
7
2
1 2
4
7 1 4 1
3
103 102 104
5
1 101 1 100 1
5
1 10 100 1000 1
2
3 1
3
1000000000 999999997 999999999
样例输出 #1
2
2
3
2
1
1
2
提示
In the first test case, it is optimal to choose p=[2,1] . Then after applying the operation, the array a will be [3,3] , in which the number 3 occurs twice, so the answer is 2 .
In the second test case, one of the optimal options is p=[2,3,1,4] . After applying the operation, the array a will be [9,4,5,5] . Since the number 5 occurs twice, the answer is 2 .
如果一个区间的右端点和左端点的差值小于n,那么这个区间就可以用排列的数字凑成数值一样的区间,找最长的区间
首先从小到大排列,然后去重,去重的意义是排列的数字都是不同的,对于同一个数字加上不同的数一定不等,所一相同的数字取一个即可
const int N = 2e5 + 10;
int a[N];
int b[N];
void solve()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + 1 + n);
int h = 0;
for (int i = 1; i <= n; i++)
{
if (a[i] != a[i - 1]) b[++h] = a[i];
}
int i = 1;
int j = i + 1;
int ans = 0;
while (i <= h)
{
while (b[j] - b[i] < n && j <= h) j++;
ans = max(ans, j - i);
i++;
}
cout << ans << '\n';
}