D. Epic Transformation
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
You are given an array a of length n consisting of integers. You can apply the following operation, consisting of several steps, on the array a zero or more times:
you select two different numbers in the array ai and aj;
you remove i-th and j-th elements from the array.
For example, if n=6 and a=[1,6,1,1,4,4], then you can perform the following sequence of operations:
select i=1,j=5. The array a becomes equal to [6,1,1,4];
select i=1,j=2. The array a becomes equal to [1,4].
What can be the minimum size of the array after applying some sequence of operations to it?
Input
The first line contains a single integer t (1≤t≤104). Then t test cases follow.
The first line of each test case contains a single integer n (1≤n≤2⋅105) is length of the array a.
The second line of each test case contains n integers a1,a2,…,an (1≤ai≤109).
It is guaranteed that the sum of n over all test cases does not exceed 2⋅105.
Output
For each test case, output the minimum possible size of the array after applying some sequence of operations to it.
思路:
使用优先队列模拟删数的过程,每次删除数量最多的两个不同的数字。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[200010];
map<ll,int>vis;
priority_queue<ll,vector<ll>,less<ll> >q;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
while(!q.empty())
q.pop();
vis.clear();
memset(a,0,sizeof(a));
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
scanf("%lld",&a[i]);
vis[a[i]]++;
}
for(int i = 1; i <= n; i++)
{
if( vis[a[i]] != 0)
{
q.push(vis[a[i]]);
vis[a[i]] = 0;
}
}
while(q.size() > 1)
{
ll one = q.top();
q.pop();
ll two = q.top();
q.pop();
one--;
two--;
if(one)
q.push(one);
if(two)
q.push(two);
if(!one && !two && q.size() == 0)
{
q.push(0);
break;
}
}
ll ans = q.top();
q.pop();
printf("%lld\n",ans);
}
}