zoukankan      html  css  js  c++  java
  • 小G的LY数对

    题目链接

    • 题意:小G定义LY数对为两个数x,y在二进制的异或操作后恰好有两位是1。小G现在有两个数组a,b长度分别为n,m。现在小G想知道有多少对i,j满足(1<=i<=n,1<=j<=m),满足a[i]和b[j]是LY数对。
    • 题解:非正解暴力的做法是 (O(n imes 30 imes 29)) 的做法,但是判重由于unordered_map的常数过大,直接判重会T,所以有大神指出用 (bitset) 来做,我因为从来没接触过bitset,所以也很好奇能做啥,一点点积累吧,这里,首先bitset空间是可以开到 (1e9),因为一位是 (1bit),所以 ((1<<30)/8/1024/1024 = 128MB) 一般题目也是绰绰有余了。然后用法是,bitset<30>bit;就定义了一个30位的二进制串,然后是从 (0-30),所以是取到 (bit[0])(bit[29])(bit.flip()) 是全部取反,然后 (bit.flip(x)) 是在 (x) 位上取反。
    对于一个叫做bit的bitset:
    bit.size()       返回大小(位数)
    bit.count()     返回1的个数
    bit.any()       返回是否有1
    bit.none()      返回是否没有1
    bit.set()       全都变成1
    bit.set(p)      将第p + 1位变成1(bitset是从第0位开始的!) 
    bit.set(p, x)   将第p + 1位变成x
    bit.reset()     全都变成0
    bit.reset(p)    将第p + 1位变成0
    bit.flip()      全都取反
    bit.flip(p)     将第p + 1位取反
    bit.to_ulong()  返回它转换为unsigned long的结果,如果超出范围则报错
    bit.to_ullong() 返回它转换为unsigned long long的结果,如果超出范围则报错
    bit.to_string() 返回它转换为string的结果
    
    • 代码:
    #include <algorithm>
    #include <cmath>
    #include <cstdio>
    #include <cstring>
    #include <bitset>
    #include <iostream>
    #include <unordered_map>
    #include <queue>
    #include <vector>
    using namespace std;
    typedef long long ll;
    const ll N = 3e5 + 99;
    ll mod = 1e9 + 7;
    const ll maxn = 1e7;
    unordered_map<ll, ll> cnt;
    ll a[N], b[N];
    bitset <1 << 30> vis;
    void solve() {
        ll n, m;
        cin >> n >> m;
        ll len = 0;
        ll ma = -1;
        for (int i = 1; i <= n; i ++) {
            scanf("%lld", &a[i]);
        }
        for (int j = 1; j <= m; j ++) {
            scanf("%lld",&b[j]);
            if (!cnt.count(b[j]))cnt[b[j]] = 0;
            vis.set(b[j]);
            cnt[b[j]]++;
        }
        ll ans = 0;
        for (int j = 0; j < 30; j++) {
            bitset<30>d;
            for (int k = j + 1; k < 30; k++) {
                for (int i = 1; i <= n; i++) {
                    bitset<30> t = a[i];
                    t.flip(j);t.flip(k);
                    int dd = t.to_ulong();
                    if (vis[dd])
                    ans += cnt[dd ];
                }
            }
        }
        printf("%lld
    ", ans);
    }
    signed main() {
        ll t = 1;
        while (t--) solve();
        return 0;
    }
    
  • 相关阅读:
    CSS盒子模式(DIV布局快速入门)
    CSS中的滑动门技术
    由浅入深漫谈margin属性
    zz Apache 虚拟主机 VirtualHost 配置
    动态生成编译运行java类
    ubuntu 手动设置DNS服务器,重启后不能上网
    ubuntu下部署发布环境
    zz [Java]读取文件方法大全
    Ubuntu apache2 主机配置文件
    JAVA的CALLBACK
  • 原文地址:https://www.cnblogs.com/Xiao-yan/p/14607863.html
Copyright © 2011-2022 走看看