CF1926D Vlad and Division 题解

首先,题目中说每一组中的数需要两两之间都满足二进制完全不相等,所以一组只能有 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

橙到黄吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值