牛客 - 小V的序列(思维+位运算)
题目链接:点击查看
题目大意:给出一个均匀分布,长度为 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的序列(思维+位运算)相关推荐
- 牛客 - Dress as women(sg定理+位运算)
题目链接:点击查看 题目大意:两个人正在玩游戏,现在给出 n 个点,两个人轮流操作,每次可以选择任意个贡献的顶点然后删除,最后无法操作的人失败 题目分析:读完题后想到了之前做过的一道题目:点击查看 因 ...
- 牛客题霸 [括号序列] C++题解/答案
牛客题霸 [括号序列] C++题解/答案 题目描述 给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列 括号必须以正确的顺序关闭,&quo ...
- 牛客小d和孤独的区间
牛客小d和孤独的区间 这道题我们如果等到数据都输入完后再计算会浪费很多时间 所以还是每次输入都计算一遍 我们知道要找到一个区间里只有一个1,其余都是0 所以这时候我们可以将输入分为两种情况 1,输入为 ...
- 思维题-牛客网-强迫症的序列
题目: 链接:https://ac.nowcoder.com/acm/contest/90/J?&headNav=www 来源:牛客网 题目描述 牛客网是IT求职神器,提供海量C++.JAVA ...
- oj记录 牛客小I白月赛50 C减法与求余 (思维
题目描述 链接:https://ac.nowcoder.com/acm/contest/11227/C 来源:牛客网 鸡尾酒的学生丹丹分不清求余和减法,因为他觉得两种运算都是将一个数字变小,所以都差不 ...
- 牛刀小试(牛客小题)
今天为大家带来了几道牛客网的题 很简单 注重基础 BC105 矩阵相等判定 描述 KiKi得到了两个n行m列的矩阵,他想知道两个矩阵是否相等,请你回答他.(当两个矩阵对应数组元素都相等时两个矩阵相等) ...
- 牛客—— 小A的最短路 (LCA)
[牛客] 小A的最短路 (LCA) 原题链接 题意: 给定一棵树,除给定的特殊边边权为0外,其余边权均为1.求两点之间的最短距离.n为3e5 思路: 今天碰到的第一道喜欢的题hhhhhh 题目是一棵树 ...
- 牛客小bai月赛43——C 木棍游戏(DFS)
题目如下: 来源:牛客网 题目描述 给出 n 根长度不一的木棍,第 iii 根棍子长度为 ai .两根长度分别为 Ab 和Ac 的木棍可以拼接成一根长度为Ab+Ac 的木棍,同理 3 根, 4 根 ...
- 牛客-小a与星际探索
这是一道伪图论题 链接:https://ac.nowcoder.com/acm/problem/22144 来源:牛客网 题目描述 小a正在玩一款星际探索游戏,小a需要驾驶着飞船从11号星球出发前往n ...
最新文章
- 在linux下查询日志
- 如何从命令行浏览和连接到无线网络
- Xshell显示中文乱码问题
- 灰度值取值范围_第三章 灰度变换与空间滤波-(三)直方图之直方图均衡
- 微信小程序中rpx与rem单位使用
- Java中 break continue return 的用法以及区别
- jQuery实现输入框聚焦,键盘上下键选择城市
- paip.c++ bcb string 转换操作大总结.
- 什么是传感器?不同类型的传感器及其应用
- vue中使用echarts地图
- 路由器常见故障排除及解决方法!
- 使用pygame制作Flappy bird小游戏
- PostgreSQL年龄的处理
- 有源晶振和无源晶振区别
- 优课联盟 实境英语 Test for Unit 9
- drupal 中基本的数据库操作
- Windows 配置Java环境
- 历史上著名的软件质量事故
- 输出一个由*组成的三角形图案_一文带你读懂集成电路的组成与封装形式
- 使用pdfbox将pdf转换成图片的时候,STSong-Light字体不存在解决方案