题目链接:点击查看

题目大意:给出一个均匀分布,长度为 n 的数列,再给出 m 次询问,每次询问给出一个 y ,询问数列中是否存在 x 与 y 相似,相似的定义如下:

x,y相似当且仅当x xor y的二进制表示中1的个数小于等于3个。

题目分析:这个题目确实很巧啊,首先 n 和 m 都是 1e6 级别的,所以每个查询需要在常数级别的时间复杂度内完成,而 n 是 1e6 , 且每个数的范围是 2^64 ,且所有数字类似于随机数一样均匀分布,这里先提一下,下面要用

然后是需要根据题意转换一个结论,若 x 和 y 相似,需要满足 xor 后不同的位置小于等于 3 ,也就是说,将 2^64 分成四组,每一组的长度为 2^16 ,如果 x 和 y 相似的话,那么至少有一组是完全相同的,根据这一性质,可以将 1e6 个数分为四组,而正因为是均匀分布,1e6 ≈ 2^20 个不同的数,每一组的长度为 2^16 ,即每一组最多有 2^16 个不同的数,故最 n 个数中最多有 (2^20)/(2^16)=2^4=16 个数在某一组的同一个位置,这样我们对于每个询问 y 查询的时间复杂度也就变为了 4 * 16 * 3 了,其中的 3 是需要进行三次 lowbit 运算

可能我解释的有一些不好,原题解如下:

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;typedef uint64_t ull;const int inf=0x3f3f3f3f;const int N=110;const int mod=998244353;vector<ull>p[4][(1<<16)+100];uint64_t G(uint64_t x)
{x^=x<<13;x^=x>>7;x^=x<<17;return x;
}void add(ull x)
{ull temp=x;for(int i=0;i<4;i++){p[i][temp%(1<<16)].push_back(x);temp>>=16;}
}ull lowbit(ull x)
{return x&(-x);
}bool check(ull x)
{for(int i=0;i<3;i++)x-=lowbit(x);return x==0;
}int cal(ull x)
{ull temp=x;for(int i=0;i<4;i++){for(int j=0;j<p[i][temp%(1<<16)].size();j++)if(check(p[i][temp%(1<<16)][j]^x))return 1;temp>>=16;}return 0;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m;scanf("%d%d",&n,&m);ull k;scanf("%llu",&k);for(int i=1;i<=n;i++){add(k);k=G(k);}LL ans=0;while(m--){ull y;scanf("%llu",&y);ans=(ans*2+cal(y))%mod;}printf("%lld\n",ans);return 0;
}

牛客 - 小V的序列(思维+位运算)相关推荐

  1. 牛客 - Dress as women(sg定理+位运算)

    题目链接:点击查看 题目大意:两个人正在玩游戏,现在给出 n 个点,两个人轮流操作,每次可以选择任意个贡献的顶点然后删除,最后无法操作的人失败 题目分析:读完题后想到了之前做过的一道题目:点击查看 因 ...

  2. 牛客题霸 [括号序列] C++题解/答案

    牛客题霸 [括号序列] C++题解/答案 题目描述 给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列 括号必须以正确的顺序关闭,&quo ...

  3. 牛客小d和孤独的区间

    牛客小d和孤独的区间 这道题我们如果等到数据都输入完后再计算会浪费很多时间 所以还是每次输入都计算一遍 我们知道要找到一个区间里只有一个1,其余都是0 所以这时候我们可以将输入分为两种情况 1,输入为 ...

  4. 思维题-牛客网-强迫症的序列

    题目: 链接:https://ac.nowcoder.com/acm/contest/90/J?&headNav=www 来源:牛客网 题目描述 牛客网是IT求职神器,提供海量C++.JAVA ...

  5. oj记录 牛客小I白月赛50 C减法与求余 (思维

    题目描述 链接:https://ac.nowcoder.com/acm/contest/11227/C 来源:牛客网 鸡尾酒的学生丹丹分不清求余和减法,因为他觉得两种运算都是将一个数字变小,所以都差不 ...

  6. 牛刀小试(牛客小题)

    今天为大家带来了几道牛客网的题 很简单 注重基础 BC105 矩阵相等判定 描述 KiKi得到了两个n行m列的矩阵,他想知道两个矩阵是否相等,请你回答他.(当两个矩阵对应数组元素都相等时两个矩阵相等) ...

  7. 牛客—— 小A的最短路 (LCA)

    [牛客] 小A的最短路 (LCA) 原题链接 题意: 给定一棵树,除给定的特殊边边权为0外,其余边权均为1.求两点之间的最短距离.n为3e5 思路: 今天碰到的第一道喜欢的题hhhhhh 题目是一棵树 ...

  8. 牛客小bai月赛43——C 木棍游戏(DFS)

    题目如下: 来源:牛客网 题目描述 给出 n 根长度不一的木棍,第 iii 根棍子长度为 ai .两根长度分别为 Ab 和​Ac 的木棍可以拼接成一根长度为Ab+Ac​ 的木棍,同理 3 根, 4 根 ...

  9. 牛客-小a与星际探索

    这是一道伪图论题 链接:https://ac.nowcoder.com/acm/problem/22144 来源:牛客网 题目描述 小a正在玩一款星际探索游戏,小a需要驾驶着飞船从11号星球出发前往n ...

最新文章

  1. 在linux下查询日志
  2. 如何从命令行浏览和连接到无线网络
  3. Xshell显示中文乱码问题
  4. 灰度值取值范围_第三章 灰度变换与空间滤波-(三)直方图之直方图均衡
  5. 微信小程序中rpx与rem单位使用
  6. Java中 break continue return 的用法以及区别
  7. jQuery实现输入框聚焦,键盘上下键选择城市
  8. paip.c++ bcb string 转换操作大总结.
  9. 什么是传感器?不同类型的传感器及其应用
  10. vue中使用echarts地图
  11. 路由器常见故障排除及解决方法!
  12. 使用pygame制作Flappy bird小游戏
  13. PostgreSQL年龄的处理
  14. 有源晶振和无源晶振区别
  15. 优课联盟 实境英语 Test for Unit 9
  16. drupal 中基本的数据库操作
  17. Windows 配置Java环境
  18. 历史上著名的软件质量事故
  19. 输出一个由*组成的三角形图案_一文带你读懂集成电路的组成与封装形式
  20. 使用pdfbox将pdf转换成图片的时候,STSong-Light字体不存在解决方案

热门文章

  1. MySQL where后面的标量子查询使用
  2. RabbitMQ发布确认原理
  3. canal数据同步(应用场景)
  4. SpringIOC容器介绍
  5. 分隔线演练-利用参数增加分隔线的灵活度
  6. Eureka深入理解
  7. 原型模式coding-克隆破坏单例
  8. 【多态】多态的向下转型
  9. JAVA基本数据类型和String类型的转换
  10. 0R电阻的12种妙用---摘自:俸禄的小三