首先,题目中说每一组中的数需要两两之间都满足二进制完全不相等,所以一组只能有 2 2 2 个数。
考虑给定 x x x,如何构造出二进制与 x x x 每一位都不相同的数。
其实,这个数就是 x xor 2147483647 x \operatorname{xor} 2147483647 xxor2147483647。
那么我们只需对于每一个 a i a_i ai,寻找 a i xor 2147483647 a_i \operatorname{xor} 2147483647 aixor2147483647 是否存在于数组中且未被配对过。如果有,那么标记两个数被配对过并令 a n s + 1 ans + 1 ans+1;否则,说明 a i a_i ai 只能自己单独成一组,同样令 a n s + 1 ans+1 ans+1。
最后答案就是 a n s ans ans,单组时间复杂度 O ( n log n ) O(n\log n) O(nlogn)。
#include <bits/stdc++.h>
using namespace std;
long long a[200005],b[200005];
//b[i]表示a[i]在相同元素中是第几个
map<long long,int> mp,c;
//mp[i]表示i在整个数组中出现了几次
map<long long,int> mp2;
//mp2[i]表示为i的元素有几个已经配对完成
int main() {
int t; scanf("%d",&t);
while(t--) {
mp.clear();
c.clear();
mp2.clear();
int n; scanf("%d",&n);
for(int i = 1;i <= n;i++) {
scanf("%lld",&a[i]);
mp[a[i]]++;
b[i] = mp[a[i]];
}
int cnt = 1;
for(int i = 1;i <= n;i++) {
if(b[i] <= mp2[a[i]]) {
// cout << i << " of course it not!!!\n";
continue;
}
if(i != 1) cnt++;
long long fan = a[i] ^ 2147483647ll;
int last = mp[fan] - mp2[fan];
if(!last) {
continue;
// cout << i << " I think it's not.\n'";
}
mp2[fan]++;
mp2[a[i]]++;
}
printf("%d\n",cnt);
}
return 0;
}
注意这题不卡时间但是卡 unordered_map
。
橙到黄吧。