按位或

#include<iostream>
using namespace std;
int p[131072];
int mx = 131071;//二进制为17个1,题中范围内的数字,每位都是1
int q;
int main()
{
    /*对于每一次询问,我们肯定会选择所有y,满足y&x==y,即在二进制表达下,y是x的子集。
那么我们可以维护一个数组p[i],表示所有为i的子集的数字的Or值是多少。每次插入一个数字,如果它
没有重复出现过,就枚举它的超集更新答案。询问的时候只需要看p[x]是否等于x就好了。*/
    scanf("%d", &q);//几组数据
    while (q--)
    {
        int op, x; 
        scanf("%d%d", &op, &x);//op  1插入,2查询
        if (op == 1) 
        {
            if (p[x] == x) //此次插入数字已经存在,且插入0这里就终止了
                continue;
            int s = mx ^ x; //按位异或运算符,同0异1,相当于按位取反.
            for (int i = s; i; i = (i - 1) & s)//退出循环i==0.对插入的每一个数x,将二进制所有为1和x相同的记录
                p[i ^ x] |= x;
            p[x] = x;
        }
        else 
        {
            if (p[x] == x) 
                puts("YES");
            else 
                puts("NO");
        }
    }
    return 0;
}

全部评论

相关推荐

沉淀一会:**圣经 1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
11-08 17:36
诺瓦科技_HR
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务