Equalize

haihaichibaola發表於2024-07-07

Equalize

題面翻譯

有一個給定的長度為 \(n\) 的數列 \(a\),現在加上一個排列 \(b\),即 \(c_i=a_i+b_i\)

現在求對於所有可能的 \(b\)\(c\)出現最多的數的出現次數的最大值。

translate by @UniGravity.

題目描述

Vasya has two hobbies — adding permutations $ ^{\dagger} $ 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 $ p_1, p_2, p_3, \ldots, p_n $ of length $ n $ , and then change the elements of the array $ a $ according to the rule $ a_i := a_i + p_i $ . 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.

$ ^{\dagger} $ 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 \leq t \leq 2 \cdot 10^4 $ ) — 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 \le n \le 2 \cdot 10^5 $ ) — the length of the array $ a $ .

The second line of each test case contains $ n $ integers $ a_1, a_2, \ldots, a_n $ ( $ 1 \le a_i \le 10^9 $ ) — the elements of the array $ a $ .

It is guaranteed that the sum of $ n $ over all test cases does not exceed $ 2 \cdot 10^5 $ .

輸出格式

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\)的數對原序列中的資料進行替換後陣列中可以透過上述操作所獲得的相同的元素的最大數量。

可以先進行試想,對於一個等差數列我們可以透過加上一個完全相反的數列,使得所有數都變為相同的數,滿足了題目的要求。

因為序列不對替換順序進行要求,我們可以打亂原陣列的順序,構造一個含有間斷點的類似於等差數列的序列。也就是說,我們可以對原序列進行排序,然後取出中間任意一部分理想的子序列構造出一個含有部分相同項和缺少部分項的等差數列。不難發現,因為題目中進行相加的序列不可以出現重複的數值,所以如果原序列中出現了相同的數,不可能存在相加不同的數的操作使得原序列中的兩個相同的數仍然相同的情況。所以原序列相同的資料僅僅可能只有其中的一個是有效的。我們就可以把我們構造出的序列中的相同項全部刪除,得到一個缺失部分項的等差數列。

題目中沒有說明所有\(\leq n\)的數都必須使用,也就是說,我們可以再次構建一個缺少項的等差數列,讓缺少項的等差序列和上文中構建的序列相加,這個使得這個序列和剛才我們構建的序列滿足我們試想中的情況。

所以,我們就可以先判斷試想中的合法條件,然後推廣到這個題目。

在試想的情況中,我們應用類似於題目中的條件,即相反的序列必須滿足\(\leq n\)。由於沒有重複項,並且序列是滿足遞增的(單調),如果最大項和最小項(也就是要進行判斷合法的序列中差值最大、最難相等的兩個數)在這個條件下可以成立,那麼其它差值較小的元素也一定可以成立。

我們希望最大項和最小項相等,那麼就要讓最小項的加值儘可能大,讓最大項的加值儘可能小。那麼在保證合法的前提下使用構造的相反數列中的最小項1和最大項\(n\)。我們讓最小值+n,最大值+1。如果存在$ max + 1 \leq min + n $的情況成立,那麼其它項之間較小的插值也一定能透過這個相反序列滿足。題目中我們所能夠構造的數列僅僅是試想中兩個互相相反的序列各去除了一些項所得到的,所以我們可以將這個條件直接應用到解題中。

我們可以使用雙指標去列舉所有合法的情況然後取出最大值作為答案。也可以使用$ max + 1 \leq min + n $這個條件,列舉左端點,然後使用二分查詢尋找所有合法的右端點,然後取出最大值(直接暴力時間複雜度過高會超時)。

(僅列舉第一種方法)

#include<bits/stdc++.h>
using namespace std;
int t,n;
vector<long long>a(n);
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		vector<long long>a(n);
		for(int i=0;i<n-1;i++){
			scanf("%d ",&a[i]);
		}scanf("%d",&a[n-1]);
		sort(a.begin(),a.end());
		a.erase(unique(a.begin(), a.end()), a.end());
		int m = a.size(), res = 0;
		for (int l=0,r=0;r<m;r++){
			while(l<=r&&a[r]+1-a[l]>n)l++;
			if(l<=r&&a[r]+1-a[l]<=n)res=max(res,r-l+1);
		
		}
		printf("%d\n",res);
	}
	return 0;
}

相關文章